当前位置: 首页 > 面试题库 >

ViewPager片段随着时间的流逝而被破坏?

弘志勇
2023-03-14
问题内容

我正在使用Android的support.v4软件包来开发包含多个Fragment的ViewPager 。

我正在尝试在用户更改页面时隐藏视图。因此,我实现了一个OnPageChangeListener来监听适配器,并update()Fragment发生页面更改时在s中调用一个方法。但是我得到了NullPointerException,我不知道为什么。

这是代码:

public class MyActivity extends FragmentActivity implements
        OnPageChangeListener {

    private static final int NUM_ITEMS = 2;
    private ViewPager mPager;
    private static SpaceAdapter mAdapter;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_pager);

        mAdapter = new SpaceAdapter(getSupportFragmentManager());
        mPager = (ViewPager) findViewById(R.id.pager);
        mPager.setAdapter(mAdapter);

        mPager.setOnPageChangeListener(this);
}

    public static class SpaceAdapter extends FragmentPagerAdapter {

        public SpaceAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public int getCount() {
            return NUM_ITEMS;
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {
            case 0:
            return new MyFragment();
            case 1:
            return new MyFragment();
            default:
            return new MyFragment();
            }
        }
    }

    @Override
    public void onPageScrollStateChanged(int arg0) {
        Log.i("pagination", "scroll state changed: " + arg0);
}

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {
        // Log.i("pagination", "page scroll: " + arg0 + " with: " + arg1 + ", " + arg2);
        if (mAdapter.getItem(arg0) instanceof IUpdateOnPage) {
            ((IUpdateOnPage) mAdapter.getItem(arg0)).updateOnPage();
        }
    }

    @Override
    public void onPageSelected(int arg0) {
        Log.i("pagination", "page selected: " + arg0);
    }
}

public class MyFragment extends Fragment implements
        SurfaceHolder.Callback, IUpdateOnPage {

    private SurfaceView charts;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.crew, null);
        bindViews(v);
        return v;
    }

    private void bindViews(View v) {
        charts = (SurfaceView) v.findViewById(R.id.civ_charts);

        charts.getHolder().addCallback(this);
        Log.i("wtf", "huh " + String.valueOf(charts == null)); // logs false
    }

    @Override
    public void updateOnPage() {
        if (charts != null) {
            Log.i("crew surface", "hidden");
            charts.setVisibility(View.GONE);
        } else {
            Log.i("crew surface", "charts is null");  //THIS HERE gets logged
        }
    }
}

w当我复制/粘贴时,我删除了SurfaceHolder.Callback方法,但是它们在那里。该bindViews(v)方法记录if charts == null,并且始终返回false。当我寻呼时,updateOnPage被调用并charts == null返回true。为什么会发生这种情况,我该如何解决?

这是第108行:

charts.setVisibility(View.GONE);

问题答案:

初始化时ViewPager,添加以下内容:

mPager.setOffscreenPageLimit(NUM_ITEMS-1);

在您的情况下,这会将屏幕外页面的数量设置为1(即,当其他页面当前处于焦点状态时,它将把其他屏幕外页面保留在内存中)。这将迫使您ViewPager保留所有Fragments,即使它们不在焦点上。



 类似资料:
  • 我已经创建了一个实时时钟,它与计算机时间同步,并显示在标签中。 记入NeverHopeless给出的起始代码。多谢了。

  • 我只是在写一个程序来计算从出生那天到下一个生日(JavaScript)的时间流逝。我不知道如何考虑时区和闰年,这就是为什么计算中的错误会出现在我身上——天和小时不匹配。

  • 我正试图做到这一点:http://android-er.blogspot.com/2012/06/communication-between-fragments-in.html只不过我用的是一台碎纸机 我有一个有两个片段的活动 FragmentA有一个编辑文本和一个按钮,FragmentB有一个文本视图 现在我想要的是,每当我在编辑文本中输入一些内容并单击按钮时,我的文本视图中就会出现一些内容。

  • 问题内容: 我正在开发一个简单的插件。现在,我正在尝试添加振动属性。但是此代码不起作用。我要去哪里错了?我的代码如下。你能帮我吗。 Android: 导入android.os.Vibrator; } Unity3D: 按钮事件: 提前致谢… 问题答案: 我的解决方法如下。 统一: 另外,我在1分钟之前找到了Manifest.xml文件示例。现在,该插件正在运行。

  • 我尝试使用onTabSelected来检测某个片段何时被选中,然后在接口的帮助下从该片段启动一个方法(下面的代码)。 但是,当使用Start方法时,在尝试更新TextView时会激发NullPointerException。start方法的代码是: 在以下行抛出异常: 是的,我已经在网上查过了所有可用的东西,但似乎没有任何东西对我有用。 非常感谢您的帮助!

  • 我找到的唯一解决办法就是打电话给 在显示父片段之后。这会以某种方式触发视图被重新创建并出现在屏幕上。不幸的是,这有时会导致在旧的观察器上处理两次调用的寻呼机适配器时出现异常。 有没有更好的办法做到这一点?我想我要问的是: