简体   繁体   English

在ViewPager中浏览时,应用程序崩溃

[英]App crashes while navigating with in the ViewPager

I am working on creating a gallery like view with view pager and fragments using this implementation http://developer.android.com/training/implementing-navigation/lateral.html#horizontal-paging . 我正在使用此实现http://developer.android.com/training/implementing-navigation/lateral.html#horizo​​ntal-paging创建带有视图寻呼机和片段的类似于视图的画廊。

In my code I will fetch NUM_PAGES (integer) in viewpager from a web server for particular logged in user. 在我的代码中,我将从特定用户登录的Web服务器上的viewpager中获取NUM_PAGES(整数)。

What I am doing: 我在做什么:

My pages are populated with information when the user logs in to the app, which does many checks to populate one page, So I created all the views when onCreate() is called, and reusing them each time a fragment requires them. 当用户登录到应用程序时,我的页面将填充信息,该操作会进行很多检查以填充一个页面。因此,我在调用onCreate()时创建了所有视图,并在每次需要片段时重新使用它们。

when I launch my app with multiple pages in viewpager, navigating through page 1 through page 5, The app works fine, when I try to revisit the previous page, the app crashes with the "java.lang.IllegalStateException". 当我在viewpager中启动具有多个页面的应用程序时,在第1页到第5页之间导航,该应用程序运行良好,当我尝试重新访问上一页时,该应用程序崩溃并显示“ java.lang.IllegalStateException”。

I am new to fragments and viewpager, Please help me solve this. 我是片段和Viewpager的新手,请帮助我解决这个问题。

Thanks in advance. 提前致谢。

Kiran 基兰

FATAL EXCEPTION: main
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
    at android.view.ViewGroup.addViewInner(ViewGroup.java:3435)
    at android.view.ViewGroup.addView(ViewGroup.java:3306)
    at android.view.ViewGroup.addView(ViewGroup.java:3251)
    at android.view.ViewGroup.addView(ViewGroup.java:3227)
    at android.support.v4.app.NoSaveStateFrameLayout.wrap(NoSaveStateFrameLayout.java:40)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:931)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)

My Code : 我的代码:

protected void onCreate(Bundle savedInstance){

    //my code here

    //prepare views to be used with viewpager
    setupViews();

    //setup viewpager stuff
    mAdapter = new ViewsAdapter(getSupportFragmentManager());

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

    setContentView(R.layout.activity_main);

    //other initializations here
}

public static class ViewsAdapter extends FragmentStatePagerAdapter{


    public ViewsAdapter(FragmentManager fragmentManager) {
        super(fragmentManager);
        // TODO Auto-generated constructor stub
    }

    @Override
    public Fragment getItem(int position) {
        // TODO Auto-generated method stub
        Fragment fragment = new VehicleFragment();
        Bundle args = new Bundle();

        args.putInt(VehicleFragment.VEHICLE_INDEX, position);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return NUM_PAGES;// this value will be fetched at runtime from a server.
    }

}

public class VehicleFragment extends Fragment {

    public static final String VEHICLE_INDEX = "VEHICLE_INDEX";

    @Override
    public View onCreateView(LayoutInflater inflater,
            ViewGroup container, Bundle savedInstanceState) {
        Bundle args = getArguments();
        int position = args.getInt(VEHICLE_INDEX); 
        Log.i("VehicleHome", "retrieving position : "+position+" in viewsList, where viewsList size = "+viewsList.size());
        return viewsList.get(position);
    }
}

private void setupViews() {

//prepare Views here, the views are created at runtime and added to viewsList (ArrayList) 
//for reuse with fragments. So that each time a new instance of fragment is created we won't endup 
//inflating layout file and initializing the view again and again..

//views logic 

viewsList.add(view);

}

I guess you shouldn't create a new fragment every time a page is requested. 我想您不应该在每次请求页面时创建一个新的片段。 Instead create them all at once and then just return the correct one: 而是一次全部创建它们,然后只返回正确的一个:

public static class ViewsAdapter extends FragmentStatePagerAdapter{

    private ArrayList<Fragment> fragments;

    public ViewsAdapter(FragmentManager fragmentManager) {
        super(fragmentManager);
        fragments = new ArrayList<Fragment>();
        for (int i = 0; i < NUM_PAGES; i++) {
            Fragment fragment = new VehicleFragment();
            Bundle args = new Bundle();

            args.putInt(VehicleFragment.VEHICLE_INDEX, position);
            fragment.setArguments(args);
            fragments.add(fragment);
        }
    }

    @Override
    public Fragment getItem(int position) {
        // in case dynamic amount of fragments is needed, you can create
        // new ones here if necessary (checking e.g. if position > fragments.size()-1)
        fragments.get(position);
    }

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

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM