Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 跨片段通信_Android_Sqlite_List_Tabs_Android Fragments - Fatal编程技术网

Android 跨片段通信

Android 跨片段通信,android,sqlite,list,tabs,android-fragments,Android,Sqlite,List,Tabs,Android Fragments,我正在开发一个应用程序,它有一个“艺术家列表”,一个包含大量乐队、表演者和/或作曲家的列表。它们按流派和相对流行程度排序。 从主活动转到“波段列表”活动,其中有两个选项卡。其中一个是“流派”选项卡,其中有一个常规音乐流派的列表,当您单击每个流派时,您会被发送到相应的活动,其中也有两个选项卡。第一个是“所有”选项卡,另一个是“流行”选项卡。每个选项卡都包含一个片段,其中包含一个过滤过的sqlite数据库(我说的“过滤”是指我有一个大数据库,通过过滤可以在不同的片段中显示我想要的内容,而不是为每个片

我正在开发一个应用程序,它有一个“艺术家列表”,一个包含大量乐队、表演者和/或作曲家的列表。它们按流派和相对流行程度排序。
从主活动转到“波段列表”活动,其中有两个选项卡。其中一个是“流派”选项卡,其中有一个常规音乐流派的列表,当您单击每个流派时,您会被发送到相应的活动,其中也有两个选项卡。第一个是“所有”选项卡,另一个是“流行”选项卡。每个选项卡都包含一个片段,其中包含一个过滤过的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) {
    }
}
公共类TabListener实现ActionBar.TabListener{
私人碎片;
私人最终活动能力;
私有最终字符串mTag;
私人期末班;
公共TabListener(活动、字符串标记、类clz){
活动性=活动性;
mTag=标签;
mClass=clz;
}
已选择的公共事务(选项卡,碎片事务ft){
if(mFragment==null){
MFFragment=Fragment.instantiate(mActivity,mClass.getName());
ft.add(android.R.id.content、mFragment、mTag);
}否则{
ft.attach(mFragment);
}
}
已选择公共空页(选项卡,碎片事务ft){
if(mFragment!=null){
ft.分离(mFragment);
}
}
已重新选择公共无效页签(页签,碎片事务){
}
}
谢谢,

Aleksa

如果您以编程方式创建片段并使用标记添加它们,您可以使用support FragmentManager方法:findFragmentByTag(字符串标记)

经过更多的尝试,我最终放弃了setArguments()和getArguments(),并在父活动中使用它:
public int getPosition(){return position;}

…这在子片段中:
position=((ParentActivity)getActivity()).getPosition()

我不知道这是否是最有效的方法,但它工作得很好,对于像我这样的新手来说,将一些简单的数据发送到片段是一件微不足道的事情

您可以使用《开发人员指南》中详细介绍的回调方法,然后在主机活动中设置一个变量。然后你可以让另一个片段从主活动中读取这个变量..这就是我写最后一段的原因。。。如何使用
getSupportFragmentManager().findFragmentById(R.id.article_fragment)如果没有片段,则不需要在xml中定义来使用回调方法,也不需要片段的id来传递信息。我不明白为什么需要使用findFragmentById(),使用回调将信息传递给宿主活动,并在实例化新片段时以编程方式检索该信息。谢谢您的回复!我目前正在通过向我的intent no prob添加一个额外的来将数据从genres片段发送到bandlist活动,但是当我尝试使用setArguments()和getArguments()将数据从该活动发送到它的子片段时,我在这一行(片段中)
genre=getArguments().getInt(“位置”)。有什么建议吗?