1

我有设置活动,它有 3 个选项卡(每个选项卡包含片段)+ 在主要活动中还有按钮行 - 按钮 OK 和 Cancel。当我按 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。

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

4

3 回答 3

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();
于 2013-02-14T15:14:03.317 回答
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

这不会将您的 Fragment 添加到后台堆栈,因此您只会获得选定的选项卡,其他选项卡为空。

我认为您能做的最好的事情是使用getTabCount()遍历 ActionBar 的选项卡,然后您应该能够使用getTabAt(int index) 获取您的内容。获取自定义视图()

于 2013-02-14T15:25:21.630 回答
0

将过程分为两个步骤:

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

2) 让活动在单击确定按钮时使用 SharedPreferences 保存设置。它不必访问片段,因为它总是关于用户更改的任何设置。

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

于 2013-02-14T15:44:01.700 回答