一、Activity向Fragment传送数据:
方法:使用Bundle:
- Bundle用来存放数据集。
- setArguments()方法将数据集绑定到Fragment中。
Activity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BlankFragment1 fragment = new BlankFragment1();
//创建资源绑定器bundle
Bundle bundle = new Bundle();
//添加数据到资源绑定器
bundle.putString("name","张三");
//将资源绑定器添加到fragment对象中
fragment.setArguments(bundle);
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.contain1,fragment);
fragmentTransaction.commit();
}
}
Fragment:
public class BlankFragment1 extends Fragment {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//getArguments获取该fragment对象中的bundle
Bundle bundle = getArguments();
//获取bundle中存放的数据
Log.d("ioc", bundle.getString("name"));
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_blank1, container, false);
}
}
二、Fragment向Activity传送数据:
方法一:使用java接口(观察者模式):
- 实现思路是声明一个接口,用接口实现Activity和Fragment的数据传输。
- 接口的声明在Fragment中。
- 接口的实现在Activity中。
接口:
- 这里的接口也可以创建在Activity类中。
public interface IFragmentCallback {
//Fragment调用该方法发送信息msg给Acticity,Activity中通过实现该方法来获得发来的信息msg
void sendMsgToActivity(String msg);
//Activity实现该方法将信息作为返回值,Fragment调用该方法获取到的返回值即Activity传来的信息
String getMsgFromActivity();
}
Activity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BlankFragment1 fragment = new BlankFragment1();
//Activity中通过匿名内部类的方式创建接口的实现类
IFragmentCallback iFragmentCallback = new IFragmentCallback() {
@Override
public void sendMsgToActivity(String msg) {
//接收到Fragment发来的msg数据并输出
Log.d("ioc",msg);
}
@Override
public String getMsgFromActivity() {
//向Fragment发送数据
return "我来自Activity";
}
};
/*fragment对象中有一个属性iFragmentCallback,通过给属性赋值给fragment对象的iFragmentCallback接口属性实例化,
这样Activity和Fragment就有了共同的IFragmentCallback对象,通过这个对象取得了联系(观察者模式)*/
fragment.setiFragmentCallback(iFragmentCallback);
//动态创建fragment,显示该fragment到contain1的标签内
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.contain1,fragment);
fragmentTransaction.commit();
}
}
Fragment:
public class BlankFragment1 extends Fragment {
//Fragment中要有IFragmentCallback接口属性,这里只有一个声明,具体实现在Activity中
private IFragmentCallback iFragmentCallback;
//接口对象的set方法,负责实例化接口
public void setiFragmentCallback(IFragmentCallback iFragmentCallback) {
this.iFragmentCallback = iFragmentCallback;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//调用iFragmentCallback的方法向Activity传参数,Activity实例化IFragmentCallback接口时会在sendMsgToActivity方法内对传参数进行操作
iFragmentCallback.sendMsgToActivity("你好,我来自Fragment");
//Activity实例化IFragmentCallback接口时在getMsgFromActivity方法内返回一个参数,Fragment调用该方法就会取得该参数,并进行相应操作
String msg = iFragmentCallback.getMsgFromActivity();
Log.d("ioc",msg);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_blank1, container, false);
}
}
方法二:使用第三方组件
- eventBus、LiveData…
三、实现Fragment之间互传数据:
- Fragment之间无法互传数据,所以需要一个Activity作为中间桥梁辅助两个Fragment之间的数据传输。
案例:点击ListView某个列表项跳转到对应聊天框,并显示该列表项的信息。
第一步:Fragment1(Listview列表)发送数据用户点击的列表项的信息给Activity。
iFragmentCallback iFragmentCallback;//属性
listview1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//获取到童虎点击的列表项内的TextView控件
TextView view1 = view.findViewById(R.id.text1);
//获取到TextView控件内的值
String name = view1.getText().toString();
Log.e("mylog","fragment1发送数据:"+name+"给Activity");
//通过调用sendMsgToActivity方法发送数据给Activity
iFragmentCallback.sendMsgToActivity(name);
}
});
第二步:Activity接收Fragment1发来的数据发送给Fragment2。
//Activity中实例化接口
iFragmentCallback iFragmentCallback = new iFragmentCallback() {
//通过实现接口的sendMsgToActivity方法得到fragment1传来的值msg(因为fragment1中调用该方法并传入一个参数msg)
@Override
public void sendMsgToActivity(String msg) {
//创建资源绑定器bundle,用于Activity向fragment发送数据
Bundle bundle = new Bundle();
Log.e("mylog","Activity得到fragment1传来的信息:"+msg);
//添加数据到资源绑定器
bundle.putString("name",msg);
//将资源绑定器添加到fragment对象中
Fragment4 fragment4 = new Fragment4();
Log.e("mylog","Activity使用buddle将信息发送给fragment4");
fragment4.setArguments(bundle);
//动态创建fragment4并跳转到fragment4
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.frame,fragment4);
fragmentTransaction.commit();
}
};
//实例化的接口对象传给fragment1的属性上(观察者模式)
fragment1.iFragmentCallback = iFragmentCallback;
第三步:Fragment接收数据后对数据进行处理展示到页面上。
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_4, container, false);
TextView dialog = view.findViewById(R.id.thedialog);
Bundle bundle = getArguments();
Log.e("mylog","fragment4得到Activity发来的数据:"+bundle.getString("name"));
dialog.setText("与"+bundle.getString("name")+"的会话窗口");
return view;
}
效果:
点击某个列表项: