【问题标题】:Cross-fragment communication跨分片通信
【发布时间】:2012-12-24 07:34:41
【问题描述】:

我正在开发一个应用程序,它有一个“艺术家列表”,一个包含大量乐队、表演者和/或作曲家的列表。它们按流派和相对受欢迎程度排序。
从主要活动您转到一个“乐队列表”活动,其中有两个选项卡。其中之一是“流派”选项卡,其中包含一般音乐流派的列表,当您单击每种流派时,您会被发送到其中也有两个选项卡的相应活动。第一个是“所有”选项卡,另一个是“流行”选项卡。每个选项卡都包含一个片段,其中包含一个过滤的 sqlite 数据库(通过“过滤”,我的意思是我有一个大数据库,它被过滤以在不同的片段中显示我想要的内容,而不是为每个片段/流派使用一个新数据库)。所以现在我有 7 个流派和 14 个类;每种类型有 2 个(“全部”和“流行”)。
我现在想做的是将类的数量减少到只有两个(全部/流行),或者如果可能的话,甚至一个,通过再次过滤数据库为所有列表回收相同的片段。为了做到这一点,我需要从“流派”片段中发送一个字符串,其中包含按下的列表项(流派)的位置到包含“所有”和“流行”选项卡(片段)的活动,然后将该字符串进一步发送到片段,片段将使用它来过滤 sqlite 数据库。

我需要补充一点,我当然已经阅读了有关片段通信的 Android 开发人员指南,但我不知道如何在我的代码中使用他们的方法,因为我创建的片段有点不同,包括没有定义它们在 xml 中,因此我不知道如何使用他们的 getSupportFragmentManager().findFragmentById(R.id.article_fragment); 方法以及更多类似的东西。

这是我创建所有片段的 TabListener:

public class TabListener<T extends Fragment> implements ActionBar.TabListener {
    private Fragment mFragment;
    private final Activity mActivity;
    private final String mTag;
    private final Class<T> mClass;

    public TabListener(Activity activity, String tag, Class<T> clz) {
        mActivity = activity;
        mTag = tag;
        mClass = clz;
    }

    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        if (mFragment == null) {
            mFragment = Fragment.instantiate(mActivity, mClass.getName());
            ft.add(android.R.id.content, mFragment, mTag);
        } else {
            ft.attach(mFragment);
        }
    }

    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        if (mFragment != null) {
            ft.detach(mFragment);
        }
    }

    public void onTabReselected(Tab tab, FragmentTransaction ft) {
    }
}

谢谢,
阿列克萨

【问题讨论】:

  • 您可以使用开发人员指南中详述的回调方法,并从那里在您的主机活动中设置一个变量。然后你可以让另一个片段从主要活动中读取该变量..
  • 这正是我写最后一段的原因...如果我在 xml 中没有指定 id 的 getSupportFragmentManager().findFragmentById(R.id.article_fragment);?
  • 片段不需要在xml中定义就可以使用回调方法,也不需要片段的id来传递信息。我不明白您为什么需要使用 findFragmentById(),使用回调将信息传递给主机活动,并在实例化新片段时以编程方式检索该信息..

标签: android sqlite list tabs android-fragments


【解决方案1】:

如果您以编程方式创建片段并添加标签,您可以使用支持 FragmentManager 方法:findFragmentByTag(String tag)

【讨论】:

  • 感谢您的回复!我目前正在通过向我的意图添加额外的 no prob 将流派片段的数据发送到乐队列表活动,但是当我尝试使用 setArguments() 和 getArguments() 将数据从该活动发送到其子片段时,我得到一个空指针异常在这一行(在片段中)genre=getArguments().getInt("position");。有什么建议吗?
【解决方案2】:

经过更多尝试,我最终放弃了 setArguments() 和 getArguments() 并在父活动中使用它:
public int getPosition(){ return position; }
...在子片段中:
position=((ParentActivity) getActivity()).getPosition();
我不知道这是否是最有效的方法,但它效果很好,并且对于像我这样的新手来说,将一些简单的数据发送到片段是一件微不足道的事情。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-16
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多