在Fragment的java文件中,可以使用getActivity()来获得调用它的activity,
然后再找到另一个Fragment,进行通信
getActivity().getFragmentManager().findFragmentById(R.id.fragment_list);
但这样做耦合度太高,不方便后续的修改操作
Fragment与其附着的Activity之间的通信,都应该由Activity来完成
不能是多个Fragment之间直接通信
Fragment与其附着的Activity之间通信最佳方式:
1. 在发起事件的Fragment中定义一个接口,接口中声明你的方法
2. 在onAttach方法中要求Activity实现该接口
3. 在Activity中实现该方法
例如一个activity中布置了2个Fragment,它们之间的通信要依靠activity来完成
代码: ListStoreActivity.java NewItemFragment.java ListStoreFragment.java
布局文件为: liststore.xml new_item_fragment.xml
准备布局文件:
liststore.xml 用LinearLayout中放置了2个fragment,分别指向2个Fragment文件
<fragment android:id="@+id/fragment_new" android:name="com.rust.liststore.NewItemFragment" android:layout_width="match_parent" android:layout_height="wrap_content" /> <fragment android:id="@+id/fragment_listview" android:name="com.rust.liststore.ListStoreFragment" android:layout_width="match_parent" android:layout_height="wrap_content" />
new_item_fragment.xml 中并排放置一个EditText和一个按钮
<EditText android:id="@+id/edittx_new" android:layout_width="0dp" android:layout_weight="4" android:layout_height="wrap_content" android:hint="@string/hint_new" /> <Button android:id="@+id/btn_add_new_item" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="@string/hint_add_new_item" />
ListStoreFragment.java
public class ListStoreFragment extends ListFragment{ /// 继承自ListFragment,已经封装好了listview /// 不需要自己写ListView了 }
NewItemFragment.java 主要代码如下
/** * 声明一个接口,定义向activity传递的方法 * 绑定的activity必须实现这个方法 */ public interface OnNewItemAddedListener { public void newItemAdded(String content); } private OnNewItemAddedListener onNewItemAddedListener; private Button btnAddItem; /*复写onAttach方法*/ @Override public void onAttach(Activity activity) { super.onAttach(activity); try { onNewItemAddedListener = (OnNewItemAddedListener) activity; } catch (ClassCastException e){ throw new ClassCastException(activity.toString() + "must implement OnNewItemAddedListener"); } }
ListStoreActivity.java
加载主视图setContentView(R.layout.liststore);
两个Fragment通过 ListStoreActivity.java 来通信
在onCreate方法中获取ListStoreFragment的实例;并且复写newItemAdded方法,在里面加上业务逻辑
public class ListStoreActivity extends Activity implements OnNewItemAddedListener{ private ArrayList<String> data; private ArrayAdapter<String> adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.liststore); data = new ArrayList<String>(); // 把data装入adapter中 adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data); // ListFragment并不需要再定义一个listview ListStoreFragment listStoreFragment = (ListStoreFragment) getFragmentManager().findFragmentById(R.id.fragment_listview); listStoreFragment.setListAdapter(adapter); } @Override public void newItemAdded(String content) { // 复写接口中的方法,业务代码在这里实现 if(!content.equals("")) { data.add(content); adapter.notifyDataSetChanged(); } } }
至此,通信搭建完成