2015-11-02 56 views
0

我已经使用android web上的代码示例创建了选项卡视图。 http://developer.android.com/training/implementing-navigation/lateral.htmlAndroid片段活动初始化变量为空值

我已经添加了此代码来调用将设置标题的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 null”,因为它没有被初始化。

再次按下按钮会打印出“Connect cell.CellMain @ ....”。

现在我通过选择另一个选项卡并切换回相同的选项卡来更改视图。

的setTitle()方法打印出“标题空”这是不期望作为cellMain被初始化。按下按钮仍然打印出“连接cell.CellMain @ ......”

为什么我的方法的setTitle给出了我的变量一个空值?

回答

1

猜测这是由于ViewPager中的碎片生命周期造成的。

ViewPager有一个活动页面的限制,它们是当前页面和更接近片段的页面(例如:如果限制为3,您将激活当前显示的片段,下一个和先前)。其余的将通过onPause()方法。

恢复片段时会发生同样的情况。当您将片段放在前面时,该片段中不活动的片段将通过onResume方法。

根据您拥有的片段数量,您可以考虑采用不同的解决方案。

如果有两个或三个片段,改变viewPager的offsetLimit包含所有的人。

viewPager.setOffscreenPageLimit(3); 

如果您有更多的片段,想想拯救它是在的onPause()方法的状态,并恢复它的每个片段的onResume()。

+0

我已经只有2页虽然。我已经厌倦了将pagelimit设置为2.它仍然返回null。我厌倦了重载onPause方法,但它永远不会调用一次。 – Tim

1

我注意到mSectionsPagerAdapter.getItem(位置)返回导致变量始终是空的片段的新实例。

我已经手动实例化构造函数中的每个片段并相应地返回它们。

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]; 
    }