Android: 使用接口将数据传递回片段
Android: 使用接口将数据传递回片段
在我的Activity中,我有一个带有TextView的FragmentA。当我点击TextView时,FragmentA会被替换为一个带有ListView的Fragment。现在,当我点击ListView的项时,我需要返回到FragmentA并使用该列表项更新TextView。\n实现:\n我在Fragment中创建了一个接口:\n
public interface OnListItemSelectedListener { public void onListItemSelected(String msg); }
\n在`onAttach()`方法中,我有以下代码:\n
@Override public void onAttach(Activity activity) { super.onAttach(activity); try { mListener = (OnListItemSelectedListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnListItemSelectedListener"); } }
\n在我的list item的`OnClickListener()`中,我有以下代码:\n
mListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView> parent, View view, int position, long id) { String message = parent.getItemAtPosition(position).toString(); mListener.onListItemSelected(message); } });
\n然后在我的Activity中实现了该接口:\n
@Override public void onListItemSelected(String msg) { ISOFragment myFrag = (ISOFragment)getSupportFragmentManager().findFragmentById(R.id.isomain); if (myFrag != null) { myFrag.incrementdata(msg); } else { ISOFragment newFrag = new ISOFragment(); Bundle args = new Bundle(); args.putString("selecteitem", msg); newFrag.setArguments(args); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.content_frame, newFrag); transaction.addToBackStack(null); transaction.commit(); } }
\n现在,由于FragmentA不可用,它会进入`else`部分。现在我应该如何获取bundle参数并更新FragmentA中的TextView?\n假设我从A转到B,然后从B返回到A,如果我在Fragment A的`onCreateView()`中获取并更新TextView的参数,那么当我第一次运行时,它会检查参数并为null。
问题的原因是在Android中,当一个Fragment需要将数据传递回它的宿主Activity时,存在一些困难。为了解决这个问题,有人建议扩展Activity并在其中存储共享数据。新的Activity有一个获取数据的函数,返回一个实现了Parcelable接口的MyData类的对象(对于简单的数据,Serializable也可以使用)。数据在Activity的onSaveInstanceState方法中进行存储,在onCreate方法中进行恢复。
解决方法如下:
1. 创建一个新的Activity,命名为MyActivity,并在其中定义一个get数据的方法,返回一个实现了Parcelable接口的MyData类的对象:
public class MyActivity extends Activity { private MyData data; public MyData getData() { return data; } //其他代码 }
2. 在MyData类中实现Parcelable接口(或者使用Serializable接口):
public class MyData implements Parcelable { //其他代码和实现Parcelable接口的方法 }
3. 在MyActivity的onSaveInstanceState方法中,将数据保存到Bundle对象中:
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable("data", data); }
4. 在MyActivity的onCreate方法中,恢复数据:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); if (savedInstanceState != null) { data = savedInstanceState.getParcelable("data"); } }
这样,当Fragment需要将数据传递回它的宿主Activity时,可以通过调用MyActivity的getData方法获取数据。