【问题标题】:Android Fragment Activity initialized variable is giving null valueAndroid Fragment Activity 初始化变量给出空值
【发布时间】:2015-11-02 12:42:05
【问题描述】:

我使用 android web 上的代码示例创建了选项卡视图。 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 方法给我的变量一个空值?

【问题讨论】:

    标签: android tabs android-fragmentactivity


    【解决方案1】:

    猜这是由于 ViewPager 中的片段生命周期。

    ViewPager 有一个活动页面的限制,即当前页面和更接近的片段(例如:如果限制为 3,您将显示当前片段处于活动状态,它是下一个,它是上一个)。其余的将通过 onPause() 方法完成。

    恢复片段时也会发生同样的情况。当你把一个fragment放到最前面时,那个range中不活跃的fragment会通过onResume方法。

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

    如果您有两个或三个片段,请将 viewPager 的 offsetLimit 更改为包含所有片段。

        viewPager.setOffscreenPageLimit(3);
    

    如果您有更多片段,请考虑将其状态保存在 onPause() 方法中,并在每个片段的 onResume() 中恢复它。

    【讨论】:

    • 我只有 2 页。我已经厌倦了将 pagelimit 设置为 2。它仍然返回 null。我已经厌倦了重载 onPause 方法,但它从来没有被调用过一次。
    【解决方案2】:

    我注意到 mSectionsPagerAdapter.getItem(position) 返回片段的新实例,这导致变量始终为空。

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

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

    【讨论】:

      猜你喜欢
      • 2021-12-14
      • 1970-01-01
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多