Android 之 Fragment(三)
Fragment与Activity的消息传递
1. 从Activity将消息传递到Fragment中:
在Activity中创建Bundle数据包,并调用Fragment的setArguments()方法
//Activity_main.java 中的onCreate()方法
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//在Activity中给Button设置事件监听
findViewById(R.id.activity_main_btn).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//获取编辑框的输入数据
String text = ((EditText)findViewById(R.id.activity_main_et)).getText().toString();
Fragment_main fragment = new Fragment_main(); //动态创建自己定义的Fragment_main的对象
Bundle bundle = new Bundle(); //创建Bundle数据包对象
bundle.putString("message", text); //向Bundle数据包中放入编辑框中的数据
fragment.setArguments(bundle);//将数据传递给自定义的Fragment_main对象
//获取系统的FragmentManager的FragmentTransaction事物
FragmentTransaction beginTransaction = getFragmentManager().beginTransaction();
beginTransaction.add(R.id.activity_main_layout, fragment, "fragment");//向事物中添加Fragment
beginTransaction.commit();//向Activity提交事物
Toast.makeText(Activity_main.this, "向Fragment发送" + text + " 消息", Toast.LENGTH_SHORT).show();
}
});
}
//Fragment_main.java中的onCreateView()方法
public View onCreateView(LayoutInflater inflater, ViewGroup conainer, Bundle savedInstanceState) {
//解析Fragment的Layout文件
View view = inflater.inflate(R.layout.fragment_main, conainer, false);
//绑定Fragment的TextView控件
textView = (TextView) view.findViewById(R.id.fragment_main_tv);
//获取从Activity传递过来数据包中的数据
String message = getArguments().get("message") + "";
textView.setText(message); //设置到TextView上
Toast.makeText(getActivity(), "收到来自Activity的消息:" + message, Toast.LENGTH_SHORT).show();
return view;
}
2. 从Fragment将消息传递到Activity中:
在Fragment中定义一个内部回调接口,在让包含该Fragment的Activity实现该回调接口。这样Fragment可调用该回调方法将数据传递给Activity
public class Fragment_main extends Fragment {
private TextView textView;
private SendMessage sendMessage; //创建回调接口的对象
private String code = "Fragment向Activity发送消息.....";
//在Fragment中创建一个回调接口
public interface SendMessage {
void send(String code);
}
@Override
public void onAttach(Context context) {
sendMessage = (SendMessage) context; //实例化回调接口对象
super.onAttach(context);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup conainer, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main, conainer, false);
textView = (TextView) view.findViewById(R.id.fragment_main_tv);
String message = getArguments().get("message") + "";
textView.setText(message);
Toast.makeText(getActivity(), "收到来自Activity的消息:" + message, Toast.LENGTH_SHORT).show();
Toast.makeText(getActivity(), code, Toast.LENGTH_SHORT).show();
sendMessage.send(code); //向Activity传递数据
return view;
}
}
//让Activity_main实现Fragment_main中的回调接口
public class Activity_main extends Activity implements SendMessage{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.activity_main_btn).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String text = ((EditText)findViewById(R.id.activity_main_et)).getText().toString();
Fragment_main fragment = new Fragment_main();
Bundle bundle = new Bundle();
bundle.putString("message", text);
fragment.setArguments(bundle);
FragmentTransaction beginTransaction = getFragmentManager().beginTransaction();
beginTransaction.add(R.id.activity_main_layout, fragment, "fragment");
beginTransaction.commit();
Toast.makeText(Activity_main.this, "向Fragment发送" + text + " 消息", Toast.LENGTH_SHORT).show();
}
});
}
//实现回调接口中的方法,直接获取数据
public void send(String code) {
Toast.makeText(this, "收到来自Fragment的消息:" + code, Toast.LENGTH_SHORT).show();
}
}