【问题标题】:communication between fragments of fragment tab host分片标签宿主分片之间的通信
【发布时间】:2014-05-05 08:00:05
【问题描述】:

我正在使用 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 为空,第二次给出异常

【问题讨论】:

  • 贴出部分代码,以便我们为您提供帮助。

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


【解决方案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

【讨论】:

  • Ani,首先感谢您的回复。我检查了这个链接。我在我的活动中收到回调。但我无法做的是如何将数据从活动传输到第二个片段.我正在使用 setCurrentTab(1) 方法来更改选项卡。
  • @vs.thaakur 如果您在活动中引用了片段,则可以将数据作为参数传递给goToFragment2(Object someData)方法。在goToFragment2(...) 中,您使用第二个片段中的设置器(例如,fragment2.setData(someData))将这些参数传递给您的片段。希望有帮助:)
  • 主要问题是activity中fragment的引用。我通过覆盖activity的onAttachFragment方法进行了尝试,但是每个tab只调用一次。
  • @vs.thaakur onAttach 行为是正确的,它在片段“链接”到活动时触发。当您设置 FragmentTabHost 时,应在活动中处理引用。我在谷歌上有一个looksee,试试这些:stackoverflow.com/questions/15898233/…stackoverflow.com/questions/14804560/…?他们使用 FragmentManager 和标签或 id 检索片段
  • 它不工作。我使用了 findfragmentbytag 但它抛出了非法状态异常:当我在这个片段上使用 setArgument 方法时,片段已经处于活动状态
【解决方案2】:

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

String TabFragmentB;
public void setTabFragmentB(String t){
    TabFragmentB = t;
}
public String getTabFragmentB(){
    return TabFragmentB;
}

这只是 String TabFragmantB 的 getter 和 setter。 这将返回您要向其发送数据的 Fragment 的标签(我们称之为 Fragment B)。因此 Fragment 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);

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

希望这对每个人都有效,因为它对我有用。

随时进行更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-24
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    相关资源
    最近更新 更多