Android Fragment Activity初始化变量赋予空值

时间:2015-11-02 12:42:05

标签: android tabs android-fragmentactivity

我使用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方法为我的变量赋予空值?

2 个答案:

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