Android: 使用接口将数据传递回片段

15 浏览
0 Comments

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。

0
0 Comments

问题的原因是在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方法获取数据。

0