上篇文章简单的介绍了Fragment的创建和使用,Fragment的生命周期和Fragment常用方法 (Fragment的使用小结(一)),下面重点总结Fragment与Activity间的通信。
一.Fragment与Activity互相通信
Activity向动态加载的Fragmen传递数据
方案一:在Activity中创建Bundle数据包,把要传的值放到Bundle里,并调用Fragment的setArgument(Bundle bundle)方法,然后在Fragment中 通过getArguments() 得到 bundle对象,获取传入的数据。(在加载Fragment之前传递数据)
MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEditText = (EditText) findViewById(R.id.et_data);
// 1. 获取Fragment管理器.
mFm = getFragmentManager();
// 2. 开启Fragment处理事务.
mTransaction = mFm.beginTransaction();
// 3. 进行Fragment操作
mTransaction.add(R.id.container, new FirstFragment());
// 4. 进行事务的提交
mTransaction.commit();
}
public void createFragment(View view){
FirstFragment firstFragment = new FirstFragment();
Bundle bundle = new Bundle();
mText = mEditText.getText().toString().trim();
if (mEditText!=null) {
bundle.putString("text", mText);
}
firstFragment.setArguments(bundle);
mTransaction = mFm.beginTransaction();
mTransaction.replace(R.id.container, firstFragment);
mTransaction.commit();
}
FirstFragment.java
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
/** * resource:Fragment需要加载的布局文件
* root:加载layout的父ViewGroup
* attactToRoot:false,不返回父ViewGroup
* */
View mRootView = inflater.inflate(R.layout.fragment_first , container , false);
TextView text = (TextView) mRootView.findViewById(R.id.tv_data);
Bundle bundle = getArguments();
if (bundle!=null) {
text.setText(bundle.getString("text"));
}
return mRootView;
}
方案二:使用Handler机制,首先在Activity中定义一个方法用来设置Handler对象,然后在在Fragment中的回调函数onAttach()中得到Fragment所在Activity,调用此方法设置Handler,最后在Activity中发送消息给Fragment中的Hanlder进行数据传递(在加载Fragment之后传递数据)
MainActivity.java
public class MainActivity extends FragmentActivity {
private Handler mHandler;
private EditText mEditText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEditText = (EditText) findViewById(R.id.et_data);
}
//设置Handler对象
public void setHandler(Handler handler) {
mHandler = handler;
}
public void click(View view) {
FirstFragment firstFragment = new FirstFragment();
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.container, firstFragment);
ft.commit();
}
public void getData(View view) {
Message message = new Message();
message.obj = mEditText.getText().toString().trim();
message.what = 1;
mHandler.sendMessage(message);
}
}
FirstFragment.java
public class FirstFragment extends Fragment {
private MainActivity mActivity;
private TextView mText;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View mView = inflater.inflate(R.layout.fragment_first, container, false);
mText = (TextView)mView.findViewById(R.id.tv_data);
return mView;
}
public Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
mText.setText((String)msg.obj);
}
}
};
@Override
public void onAttach(Activity activity) {
// Fragment所在Activity
super.onAttach(activity);
mActivity = (MainActivity) activity;
mActivity.setHandler(mHandler);
}
}
Activity向静态加载的Fragment传递数据
a、如果你Activity中包含自己管理的Fragment的引用,可以通过引用直接访问所有的Fragment的public方法
b、如果Activity中未保存任何Fragment的引用,那么没关系,每个Fragment都有一个唯一的TAG或者ID,可以通过getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例,然后进行操作。
注:如果在Fragment中需要Context,可以通过调用getActivity(),如果该Context需要在Activity被销毁后还存在,则使用getActivity().getApplicationContext()。
方案:首先通过静态方式加载Fragment,然后在Fragment中创建数据用来接收传来的数据,设置get和set方法,接着在Activity中通过findFragmentById或者findFragmentByTag方式找到fragment,并通过set方法传递数据,最后在fragment中通过get 方法获取数据。
MainActivity.java
public class MainActivity extends FragmentActivity {
private FragmentManager mFragmentManager;
private SecondFragment mFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mFragmentManager = getSupportFragmentManager();
mFragment = (SecondFragment) mFragmentManager.findFragmentById(R.id.fragment_second);
mFragment.setTextData("Activity传过来的文本");
}
}
SecondFragment.java
public class SecondFragment extends Fragment {
public String mTextData;
private TextView mTv;
public String getTextData() {
return mTextData;
}
public void setTextData(String textData) {
mTextData = textData;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_second, container, false);
mTv = (TextView) view.findViewById(R.id.tv_data);
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mTv.setText(getTextData());
}
}