Activity与fragment之间的交互总结

来源:互联网 发布:不动产静态投资 软件 编辑:程序博客网 时间:2024/03/29 15:26
第一种:handler

首先我们来介绍使用Handler来实现Fragment与Activity 的交互。

第一步,我们需要在Activity中定义一个方法用来设置Handler对象。

public void setHandler(Handler handler) {
mHandler = handler;
}

第二步,在Fragment中的回调函数onAttach()中得到Fragment所在Activity,并调用setHandler方法,设置Handler。该Handler在Fragment中定义,用来接收消息与Fragment进行交互。

@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mActivity = (MainActivity) activity;
mActivity.setHandler(mHandler);
}


public Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 1:
text.setText((String) msg.obj);
break;
}
};

};

然后我们可以在Activity中发送消息给Fragment中的Hanlder进行交互。

public void inter(View view) {
Message msg = new Message();
msg.obj = edit.getText().toString();
msg.what = 1;
mHandler.sendMessage(msg);
}


第二种:Bundle

首先我们需要在Activity中动态添加Fragment时,用Bundle封装我们需要传递的数据。

public void button(View view) {
ArgFragment arg = new ArgFragment();
Bundle bundle = new Bundle();
bundle.putString("arg", edit.getText().toString());
arg.setArguments(bundle);
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.layout_fragment, arg);
ft.commit();
}

然后在Fragment的回调函数中通过Fragment提供的方法getArguments()取出Bundle对象。

text = (TextView) view.findViewById(R.id.text);
Bundle bundle = getArguments();
text.setText(bundle.getString("arg"));


第三种:接口回调

第一步:我们需要在Fragment中定一个接口,并确保我们的容器Activity实现了此接口:


public interface onTestListener {
public void onTest(String str);
}


@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// 这个方法是用来确认当前的Activity容器是否已经继承了该接口,如果没有将抛出异常
try {
mCallback = (onTestListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnHeadlineSelectedListener");
}
}

第二步:在我们的容器Activity中实现此接口,并实现接口中的方法。

public class MainActivity extends Activity implements onTestListener {

......

@Override
public void onTest(String str) {
text.setText(str);
}

第三步:我们在fragment执行某些特定的操作时,调用接口中声明的方法。

@Override
public void onClick(View v) {
mCallback.onTest(edit.getText().toString());
}



原创粉丝点击