您的位置:首页 > 移动开发 > Android开发

Android - Fragment (三)不同Fragment之间的通信

2015-08-05 22:35 495 查看
在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();
}
}
}


至此,通信搭建完成
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: