ViewPager片段被破坏掉了一段时间?掉了、片段、ViewPager

由网友(暴走的草泥马)分享简介:我使用Android的 support.v4 包来开发一个包含多个ViewPager 片段秒。我试图隐藏视图,当用户更改页面。所以,我实现了一个 OnPageChangeListener 来听我的适配器,在我的片段 S当一个网页发生变化的时候。但我发现了一个 NullPointerException异常,我想不通这是为...

我使用Android的 support.v4 包来开发一个包含多个ViewPager 片段秒。

我试图隐藏视图,当用户更改页面。所以,我实现了一个 OnPageChangeListener 来听我的适配器,在我的片段 S当一个网页发生变化的时候。但我发现了一个 NullPointerException异常,我想不通这是为什么。

下面是code:

 公共类MyActivity扩展FragmentActivity工具
        OnPageChangeListener {

    私有静态最终诠释NUM_ITEMS = 2;
    私人ViewPager mPager;
    私有静态SpaceAdapter mAdapter;

    / **第一次创建活动时调用。 * /
    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.fragment_pager);

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

        mPager.setOnPageChangeListener(本);
}

    公共静态类SpaceAdapter扩展FragmentPagerAdapter {

        公共SpaceAdapter(FragmentManager FM){
            超(FM);
        }

        @覆盖
        公众诠释getCount将(){
            返回NUM_ITEMS;
        }

        @覆盖
        公共片段的getItem(INT位置){
            开关(位置){
            情况下0:
            返回新MyFragment();
            情况1:
            返回新MyFragment();
            默认:
            返回新MyFragment();
            }
        }
    }

    @覆盖
    公共无效onPageScrollStateChanged(INT为arg0){
        Log.i(分页,滚动状态改为:+为arg0);
}

    @覆盖
    公共无效onPageScrolled(INT为arg0,浮动ARG1,ARG2 INT){
        // Log.i(分页,页面滚动:+为​​arg0 +与+ ARG1 +,+ ARG2);
        如果(mAdapter.getItem(arg0中)的instanceof IUpdateOnPage){
            ((IUpdateOnPage)mAdapter.getItem(arg0中))updateOnPage()。
        }
    }

    @覆盖
    公共无效onPageSelected(INT为arg0){
        (选定的页面:分页,+为arg0)Log.i;
    }
}
 

 公共类MyFragment扩展片段工具
        SurfaceHolder.Callback,IUpdateOnPage {

    私人SurfaceView图;

    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
    }

    @覆盖
    公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
            捆绑savedInstanceState){
        视图V = inflater.inflate(R.layout.crew,NULL);
        bindViews(五);
        返回伏;
    }

    私人无效bindViews(视图v){
        图表=(SurfaceView)v.findViewById(R.id.civ_charts);

        。charts.getHolder()的addCallback(本);
        Log.i(跆拳道,呵呵+将String.valueOf(图== NULL)); //日志假
    }

    @覆盖
    公共无效updateOnPage(){
        如果(图!= NULL){
            Log.i(剧组面,隐藏);
            charts.setVisibility(View.GONE);
        } 其他 {
            Log.i(剧组面,图表为空); //这个在这里得到记录
        }
    }
}
 
Android 4 Fragment,ViewPager

w当我复制/粘贴我删除了 SurfaceHolder.Callback 方法,但它们的存在。该 bindViews(V)方法日志,如果图表== NULL ,并且始终返回false。当我页, updateOnPage 被调用,而图表== NULL 返回true。为什么会这样?我如何围绕它得到什么呢?

这是行108:

  charts.setVisibility(View.GONE);
 

解决方案

添加以下时,初始化 ViewPager

  mPager.setOffscreenPageLimit(NUM_ITEMS-1);
 

在你的情况,这将设置的屏幕外的页面1(即它将保持额外的离屏页面的内存时,另一个页面当前处于焦点的)的数量。这将迫使你的 ViewPager 保留所有的片段第即使他们没有焦点。

I am using Android's support.v4 package to develop a ViewPager containing multiple Fragments.

I am trying to hide the Views when the user changes page. So, I implemented an OnPageChangeListener to listen to my adapter, and call an update() method in my Fragments when when a page change occurs. But I'm getting a NullPointerException, and I cannot figure out why.

Here is the code:

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

and

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

wWhen I copy/pasted I removed the SurfaceHolder.Callback methods, but they are there. The bindViews(v) method logs if charts == null, and that always returns false. When I page, updateOnPage gets called, and charts == null returns true. Why does this happen and how do I get around it?

and this is line 108:

charts.setVisibility(View.GONE);

解决方案

Add the following when you initialize your ViewPager,

mPager.setOffscreenPageLimit(NUM_ITEMS-1);

In your case, this will set the number of off-screen pages to 1 (i.e. it will keep the additional off-screen page in memory when the other page is currently in focus). This will force your ViewPager to keep all of the Fragments even when they are not in focus.

阅读全文

相关推荐

最新文章