与另一个片段通信的片段接口

Posted

技术标签:

【中文标题】与另一个片段通信的片段接口【英文标题】:Fragment interface communicating with another fragment 【发布时间】:2012-09-07 04:18:27 【问题描述】:

我已经参考了 2 次以上,并尽力了解 2 个片段之间的通信。借助此处上一个问题的帮助 + 2 个参考资料,我能够提出此代码。我必须在我的 FragB 中放入什么来检索用户在 ListFragment FragA 中所做的选择?

主要活动:

public class MainActivity extends Activity implements OnDataPass
...

@Override
public void onDataPass(String data) 
    // TODO Auto-generated method stub

    FragA transaction1 = ((FragA) getFragmentManager().findFragmentByTag("ItemRoleList"));
    transaction1.dataPasser.onDataPass(data);


这里是 FragA:

public class FragA extends ListFragment

OnDataPass dataPasser;

public interface OnDataPass
    public void onDataPass(String data);


@Override
public void onAttach(Activity a) 
    super.onAttach(a);

    // This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception
    try 
        dataPasser = (OnDataPass) a;
     catch (ClassCastException e) 
        throw new ClassCastException(a.toString()
                + " must implement OnHeadlineSelectedListener");
    

【问题讨论】:

【参考方案1】:

这是我的理解。您在活动中有两个片段(A,B)。 A 是一个列表片段。在 A 中选择一个项目时,您必须将一个字符串传递给 B。

首先在 Fragment A 中覆盖 onListItemClick()

片段A:

public class FragmentA extends ListFragment
    ...

    void onListItemClick(ListView l, View v, int position, long id)
        datapasser.onDatapass(data)//here pass the String
    

在您的活动的 onDataPass 方法中:

void onDataPass(String data)
    FragmentB dataUser = getFragmentB();//Your FragmentB object
    dataUser.use(data);

片段 B:

public class FragmentB extends Fragment
    ...

    void use(String data)
        //here use the data
    

【讨论】:

那么什么时候访问 void use(String data) 呢?是在 onActivityCreated() 之前还是之后?原因基本上在 FragB 中(FragB 是一个 ListFragment,对不起,我之前没有具体说明这一点)取决于从 FragA 在 ListFragment 上的选择传入的字符串,FragB 进入数据库,我必须检索一个列表。那么我怎样才能在我的 onActivityCreated() 中访问这些信息呢?【参考方案2】:

我实现这一点的方式是使用观察者模式。伪代码如下:

活动

public myActivity extends Activity implements OnDataPass 
    Observable fragmentData;

    void onDataPass(String data)  fragmentData = data; 

片段 A

...
datapasser.onDataPass(data);
...

片段 B

public FragmentB extends Fragment implements Observer 

onCreate(...) 
    ...
    ((myActivity)getActivity()).fragmentData.addObserver(this);
    ...


update(Object data) 
   // Voila - you will arrive here whenever the data is updated

希望这会有所帮助...

【讨论】:

我的FragB我忘了说是一个ListFragment,但是update(Object data)是在这一行访问的,((myActivity)getActivity()).fragmentData.addObserver(this);?跨度> 我在 void onDataPass(String data) fragmentData = data; 中出现错误,原因是类型不匹配。 道歉 - 有一个错误。它应该是 fragmentData.setData(data)。 observable 应该实现这个接口。希望这次能有所帮助...

以上是关于与另一个片段通信的片段接口的主要内容,如果未能解决你的问题,请参考以下文章

无法通过接口获取与片段通信的活动

如何在嵌套片段内的两个子片段之间进行通信

提交带有全屏片段的片段事务

与 viewpager 内的片段的父片段通信

片段通信问题(尝试调用虚方法)

BottomSheetDialogFragment 如何与其宿主片段通信?