其实如果面试官问了这个问题,主要是想引入EventBus
这图中的左侧是一个FirstFragment(里面是一个ListView),右侧是SecondFragment(里面是一个TextView)
在Activity中
FirstFragment firstFragment = new FirstFragment();
SecondFragment secondFragment = new SecondFragment();
getSupportFragmentManager().beginTransaction().replace(R.id.fl_first,firstFragment,"firstFragment").commit();
getSupportFragmentManager().beginTransaction().replace(R.id.fl_second,secondFragment,"secondFragment").commit();
FirstFragment中
ListView listView = view.findViewById(R.id.list_first);
final String[] strings = new String[]{"1", "2", "3", "4", "5"};
ArrayAdapter arrayAdapter = new ArrayAdapter(getContext(), android.R.layout.simple_list_item_1, strings);
listView.setAdapter(arrayAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
SecondFragment secondFragment =
(SecondFragment) getActivity().getSupportFragmentManager()
.findFragmentByTag("secondFragment");
secondFragment.setData(strings[position]);
}
});
SecndFragment中
public void setData(String str) {
mTextView.setText(str);
}
EventBus一种优化的事件总线,在Fragment,Activity,Service,线程间传递消息,有三要素
用法很简单,先导入依赖
implementation 'org.greenrobot:eventbus:3.0.0'
在接收消息的那个地方的oncreateView里进行注册
EventBus.getDefault().register(this);
在发送消息的地方发出消息,这里还可以自己去定义一个数据类
ListView listView = view.findViewById(R.id.list_first);
final String[] strings = new String[]{"1", "2", "3", "4", "5"};
ArrayAdapter arrayAdapter = new ArrayAdapter(getContext(), android.R.layout.simple_list_item_1, strings);
listView.setAdapter(arrayAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
EventBus.getDefault().post(strings[position]);
}
});
在接收的界面收到消息,头上的类型有四种
分别是:
还有这个函数名是自己顺便命名,但头上有@subscribe这个标志
@Subscribe(threadMode = ThreadMode.MAIN)
public void ReceiveMess(String str){
mTextView.setText(str);
}
最后别忘了注销
@Override
public void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
发布版需要加混淆规则
-keepattributes *Annotation*
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe ;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
EventBus的优点:
EventBus2.x和3.0的区别: