片段标签主机片段之间的通信

时间:2014-05-05 08:00:05

标签: android android-fragments android-listview fragment fragment-tab-host

我正在使用v4支持库的FragmentTabHost实现标签。

我的第一个标签包含项目列表。当我点击列表项时,它应该移动到标签2。 我的第二个选项卡显示了列表项的描述。所以我需要将第一个选项卡的列表和单击的列表项索引传递给第二个选项卡。

我目前在应用程序级别使用getter和setter。但还有其他方法吗?这样做的最佳方式是什么?

第一个片段-Tab-0

@Override
public void onAttach(Activity activity) {
    // TODO Auto-generated method stub
    super.onAttach(activity);

    try {
        mCallback = (OnRadioSelectedListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement OnHeadlineSelectedListener");
    }
}

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    super.onListItemClick(l, v, position, id);          
        mCallback.onRadioSelected(dataList, position);
}



public interface OnRadioSelectedListener {
    public void onRadioSelected(ArrayList<DataModel> playingList, int   playingIndex);
}

Tabhost活动代码:

@Override
    public void onRadioSelected(ArrayList<DataModel> playingList, int playingIndex) {
        mPlayingIndex = playingIndex;
        mPlayingList = playingList;

       fragmentTabHost.setCurrentTab(1);
        Fragment2 frag = (Fragment2) getSupportFragmentManager().findFragmentByTag(getString(R.string.str));
    if (frag != null) {
        Bundle args = new Bundle();
        args.putSerializable("Key_list", mPlayingList);
        args.putInt("Key_current_index", mPlayingIndex);
        frag.setArguments(args);
    }


}

第一次frag为null,第二次给出异常

2 个答案:

答案 0 :(得分:1)

我建议查看这篇关于与其他片段进行通信的开发人员文章: https://developer.android.com/training/basics/fragments/communicating.html

简而言之,您的Activity实现了一个所有片段用来相互通信的接口。当片段需要做某事时,它会要求Activity处理该行为。

因此,如果fragment1想要转到fragment2fragment1会调用YourActivity.goToFragment2()(或其他),YourActivity会处理它。例如:

public void goToFragment2(){
    mTabHost.setCurrentTab (indexOfFragment2Here);
}

您需要确保Activity实现界面,因此请在“定义界面”部分中查看Fragment.onAttach(Activity activity)的实施:https://developer.android.com/training/basics/fragments/communicating.html#DefineInterface

答案 1 :(得分:1)

我知道这个问题有点老了但是如果有人仍然有兴趣知道一个简单的方法来做这个,我就走了。所以问题是在两个片段之间正确地发送数据,所以基本上你要开始的是创建一个函数,它在你的Activity中返回一个字符串。像

这样的东西
String TabFragmentB;
public void setTabFragmentB(String t){
    TabFragmentB = t;
}
public String getTabFragmentB(){
    return TabFragmentB;
}

这只是String TabFragmantB的getter和setter。 这将返回您要向其发送数据的片段的标记(让我们将其称为片段B)。因此,片段B中的代码将看起来像这样,将其写入onCreateView部分本身。

String myTag = getTag();

    ((YourActivity)getActivity()).setTabFragmentB(myTag);

此代码会将Fragmant B的标记返回给我们的活动。

同样在Fragmant B中创建一个函数,该函数接收您要在FragmantB中获取的数据类型。 在这种情况下

 public void Fucntion_FragmantB(List<YourObject> ob)
{
    //DO ANYTHING WITH THE DATA
}

现在已完成一半工作,让我们转到Fragmant A, 这就是这样的事情。

 List<YourObject> ob=new List<YourObject>();
 String TabOfFragmentB = ((Your_ACTIVITY)getActivity()).getTabFragmentB();

                    Statistics_Fragment fragmentB = (FragmentB)getActivity()
                            .getSupportFragmentManager()
                            .findFragmentByTag(TabOfFragmentB);

                    fragmentB.Fucntion_FragmantB(ob);

请注意,通过更改片段A和B中的函数,您可以传递任何类型的数据。

希望这适用于所有人,因为它适合我。

随意进行更改。