Fragment(碎片)是一种可以嵌入在Activity(活动)当中的UI片段,它能让程序更加合理和充分的利用大屏幕的空间。
既可以从Fragment传送数据到Activity,同样也可以从Activity传送数据到Fragment。接下来让我们了解一下他们是如何互相传递数据的。
从Activity向Fragment传递数据
首先们先来看看如何从Activity向Fragment传递数据,我们采用 Bundle 方式。具体代码如下:
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/text"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="我是Activity"/>
<FrameLayout
android:layout_below="@+id/button"
android:layout_height="match_parent"
android:id="@+id/fragment"
android:layout_width="match_parent"
/>
</LinearLayout>
- 首先我们先创建一个Activity 的布局文件,这个布局文件中有两个比较重要的点,一个是TextView,这个是用来显示文本的,主要是用来区分Activity和Fragment的。而FrameLayout是一种布局方式,我们给这个布局起一个名字,这样方便一会我们在写MainActivity的时候调用。
fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FF0000">
<TextView
android:id="@+id/text"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="等待Activity发送消息"
android:textSize="20dp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@id/button"
android:layout_gravity="center"
android:text="点击接收Activity的消息"
android:layout_centerInParent="true"
android:textSize="20dp"
/>
<TextView
android:id="@+id/fragment1"
android:text="我是fagment"
android:layout_gravity="center"
android:textSize="60dp"
android:textColor="#000000"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
- 可以看到,我们给这个页边一个颜色,用来区分Activity和Fragment。这个fragment布局有三个控件,一个是ID为text的TextView控件,这个控件显示的内容就是一会我们从Activity传过来的数据,Button控件是点击控件,点击之后就可以使从Activity传送到Fragment的数据显示出来,另一个ID为fragment1的控件是区别Activity和Fragment。
MainActivity.java
package com.example.activity_fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView text = (TextView) findViewById(R.id.text);
//获取FragmentManager
FragmentManager fragmentManager = getFragmentManager();
//获取FragmentTransaction
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
//创建需要添加的Fragment
final mFragment fragment = new mFragment();
//创建bundle对象
Bundle bundle = new Bundle();
//往Bundle中添加数据
bundle.putString("xin","My name is 农威能!");
//把数据设置到Fragment中
fragment.setArguments(bundle);
//动态添加Fragment
//即创建的fragment添加到Activity布局文件中定义的占位符中(FrameLayout)
fragmentTransaction.add(R.id.fragment, fragment);
fragmentTransaction.commit();
}
}
- 接下来我们写MainActivity的文件,FragmentManager是负责管理fragment并将它们的视图添加到activity的视图层级结构中,
bundle.putString("xin","My name is 农威能!");
表示往bundle中添加数据,添加的数据就是一会传到Fragment的数据,我们可以看到putString();中有两个参数,第一个参数是表示我们也要传输的数据的ID,这样我们一会需要调用的时候只需要调用这个ID就可以得到这个数据了。
mFragment.java
package com.example.activity_fragment;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
public class mFragment extends Fragment {
Bundle bundle;
String xinxi;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){
View contentView = inflater.inflate(R.layout.fragment,container,false);
//设置布局文件
//contentView.findViewById(R.id.button):利用View对象,找到XML布局中的组件
Button button = (Button) contentView.findViewById(R.id.button);
final TextView text = (TextView) contentView.findViewById(R.id.text);
//通过getArgument()获取从Activity传过来的全部值
bundle = this.getArguments();
//获取某一值
xinxi = bundle.getString("xin");
//设置按钮,将设置的值显示出来;
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//显示传过来的值
text.setText(xinxi);
}
});
return contentView;
}
}
- 最后我们写一个mFragment 文件,这里我们重写onCreateView()方法。
最后的结果如下图:
1 2从Fragment 向Activity传递数据
接下来我们采用接口回调的方式从Fragment 向Activity传递数据。
#####activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="等待Fragment发送消息"
android:textSize="20dp"/>
<Button
android:id="@+id/button"
android:layout_below="@+id/text"
android:text="点击接收Fragment消息"
android:layout_centerInParent="true"
android:textSize="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<FrameLayout
android:layout_below="@+id/button"
android:id="@+id/fragment"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
</RelativeLayout>
fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/fragment"
android:text="我是fragment"
android:gravity="center"
android:textSize="30dp"
android:background="#FF0000"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>-
- 上面这两个布局文件跟从Activity传输数据到Fragment的布局文件有着异曲同工之处,都是比较简单。
ICalback.java
package com.example.fragment_activity;
public interface ICallBack {
void get_message_from_Fragment(String string);
}
- 我们使用接口回调的方法去实现,所以必须new一个接口。
mFragment.java
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class mFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup contaner, Bundle
savedInstanceState) {
View contenView = inflater.inflate(R.layout.fragment,contaner, false);
return contenView;
}
public static void sendMesage(ICallBack callBack) {
callBack.get_message_from_Fragment("消息:我来自Fragment");
}
}
- 在mFragment中我们只要设置接口回调方法就好了。
MainActivity.java
package com.example.fragment_activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
final TextView text = (TextView) findViewById(R.id.text);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
mFragment mfragment = new mFragment();
transaction.add(R.id.fragment,mfragment);
transaction.commit();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mFragment.sendMessage(new ICallBack() {
@Override
public void get_message_from_Fragment(String string) {
text.setText(string);
}
});
}
});
}
}
- 通过接口回调将消息从fragment发送到Activity。
网友评论