操作栏选项卡 - 如何从Activity中的片段中检索值?

时间:2013-02-14 15:12:25

标签: android android-fragments android-actionbar

我有设置活动,它有3个标签(每个标签包含片段)+在主活动中还有按钮行 - 按钮确定,取消。当我按OK时,我想做这样的事情:

1)从所有片段中获取所有自定义变量 2)将它们保存到共享的首选项

但是如何访问片段变量?我试过这个:

在主要活动中添加标签:

    ActionBar.Tab tab1 = actionbar.newTab().setText(res.getString(R.string.actSettingsTab1));
    tab1.setTabListener(new MyTabsListener(new Tab1Fragment(), "tab1"));
    actionbar.addTab(tab1);
    //...similar for all tabs

这是我的标签监听器:

class MyTabsListener implements ActionBar.TabListener {
    private Fragment fragment;
    private String tag;

    public MyTabsListener(Fragment fragment, String tag) {
        this.fragment = fragment;
        this.tag = tag;
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // do nothing
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        ft.replace(R.id.fragment_container, fragment, tag);
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        ft.remove(fragment);
    }
}

这就是我想从片段中获取变量的方法:

Tab1Fragment tab1 = (Tab1Fragment) fm.findFragmentByTag("tab1");
Tab2Fragment tab2 = (Tab1Fragment) fm.findFragmentByTag("tab2");
Tab3Fragment tab3 = (Tab1Fragment) fm.findFragmentByTag("tab3");

但很奇怪 - findFragmentByTag仅为选定的选项卡返回片段,否则返回null。因此,当我选择tab1并按下ok时,findFragmentByTag会返回tab1的片段,但对其他人来说则为null。

也许我做错了什么,或者我的整个过程都是错误的。如何从父活动中的所有片段中检索值并将其保存到共享首选项?

3 个答案:

答案 0 :(得分:0)

我不建议实际访问片段中的变量。您可以在那些执行共享首选项保存所需的片段中创建公共方法。例如:

Tab1Fragment tab1 = (Tab1Fragment) fm.findFragmentByTag("tab1");
Tab2Fragment tab2 = (Tab1Fragment) fm.findFragmentByTag("tab2");
Tab3Fragment tab3 = (Tab1Fragment) fm.findFragmentByTag("tab3");
tab1.savePreferences();
tab2.savePreferences();
tab3.savePreferences();

答案 1 :(得分:0)

ActionBar.Tab tab1 = actionbar.newTab().setText(res.getString(R.string.actSettingsTab1));
tab1.setTabListener(new MyTabsListener(new Tab1Fragment(), "tab1"));
actionbar.addTab(tab1);
//...similar for all tabs

这不会将您的片段添加到Backstack,因此您只获得选定的选项卡,其他选项卡为空。

我认为您可以做的最好的事情是使用 getTabCount()遍历ActionBar的标签,然后您应该能够使用 getTabAt(int index)获取您的内容。 getCustomView()

答案 2 :(得分:0)

将过程分为两个步骤:

1)实时收集所有片段的所有设置(即,当用户更改时)。使用侦听器模式,以便片段将公开一个接口,当用户修改给定片段负责的任何设置时,它们将通过该接口通知附加的侦听器。让活动将自身附加为所有片段的监听器,并捕获更改(将它们存储在适合您的结构中)。

2)单击“确定”按钮时,让活动使用SharedPreferences保存设置。它不必访问片段,因为它始终与用户更改的任何设置有关。

这样您就不必一次访问所有片段,如果从内存中删除它们是不可能的(因为它们在给定时间无论如何都不可见)。相反,您可以在每次选择/显示时将活动重新指定为选定片段的监听器。