我使用android网站上的代码示例创建了标签视图。 http://developer.android.com/training/implementing-navigation/lateral.html
我已经添加了这段代码来调用setTitle方法来设置标题。
mViewPager.addOnPageChangeListener(
new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
FragmentInterface f = (FragmentInterface) mSectionsPagerAdapter
.getItem(position);
f.setTitle();
}
});
在我的片段类中,我将setTitle定义为
@Override
public void setTitle() {
System.out.println("Title " + cellMain);
if (cellMain != null) {
getActivity().getActionBar()
.setTitle(cellMain.cellData.getIPWithPort());
}
}
我还有一个按钮:
public void connect(View view) {
System.out.println("Connect " + cellMain);
if (cellMain == null) {
cellMain = CellMain.createAndroid(this,
getActivity().getFilesDir().toString());
getActivity().getActionBar()
.setTitle(cellMain.cellData.getIPWithPort());
}
首先我点击调用connect的按钮, 它打印出“Connect null”,这是预期的,因为它尚未初始化。
再次按下按钮会打印出“Connect cell.CellMain @ ....”。
现在我通过选择另一个标签并更改回相同的标签来更改视图。
setTitle()方法打印出“Title null”,这是因为cellMain被初始化所不期望的。按下按钮仍然会打印出“Connect cell.CellMain @ ....”
为什么我的setTitle方法为我的变量赋予空值?
答案 0 :(得分:1)
猜测它是由于ViewPager中的片段生命周期。
ViewPager有一个活动页面的限制,是当前的页面和它更接近的片段(例如:如果限制为3,您将激活显示的当前片段,它是' s接下来,它的前一个)。其余的将通过onPause()方法。
恢复片段时也会发生同样的情况。当你把一个片段带到前面时,那些不活跃的片段将通过onResume方法。
根据您拥有的片段数量,您可以在不同的解决方案中思考。
如果您有两个或三个片段,请更改viewPager的offsetLimit以包含所有片段。
viewPager.setOffscreenPageLimit(3);
如果你有更多的片段,可以考虑在onPause()方法中保存它的状态,并在每个片段的onResume()上恢复它。
答案 1 :(得分:1)
我注意到mSectionsPagerAdapter.getItem(position)返回一个新的片段实例,导致变量始终为null。
我已经在构造函数中手动实例化了每个片段并相应地返回它们。
public class SectionsPagerAdapter extends FragmentPagerAdapter {
String[] classes;
Fragment[] fragments;
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
classes = new String[]{CellView.class.getName(),
ControlPanelView.class.getName()};
fragments = new Fragment[classes.length];
for (int i = 0; i < classes.length; i++) {
fragments[i] = Fragment.instantiate(context, classes[i]);
}
}
@Override
public Fragment getItem(int position) {
//Used to be this line
//return Fragment.instantiate(context, classes[i])
return fragments[position];
}