我有设置活动,它有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。
也许我做错了什么,或者我的整个过程都是错误的。如何从父活动中的所有片段中检索值并将其保存到共享首选项?
答案 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保存设置。它不必访问片段,因为它始终与用户更改的任何设置有关。
这样您就不必一次访问所有片段,如果从内存中删除它们是不可能的(因为它们在给定时间无论如何都不可见)。相反,您可以在每次选择/显示时将活动重新指定为选定片段的监听器。