ActionBarSherlock与ViewPager没有要求ViewPager碎片会从backstack返回时,生命周期方法 [英] ActionBarSherlock with ViewPager not calling ViewPager fragments lifecycle methods when going to and returning from backstack

本文介绍了ActionBarSherlock与ViewPager没有要求ViewPager碎片会从backstack返回时,生命周期方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个使用ActionBarSherlock和主片段里面我有一个ViewPager它使用几个片段,以显示一个列表的不同对象的应用程序。

I have an application that uses ActionBarSherlock and inside the main fragment I have a ViewPager which uses several fragments to display different objects of a list.

主要片段:

    public class CollectionDemoFragment extends SherlockFragment {

    DemoCollectionPagerAdapter mDemoCollectionPagerAdapter;
    ViewPager mViewPager;

    public CollectionDemoFragment() {
        setTitle(R.string.title);
        setHasOptionsMenu(true);
    }

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.demo_fragment, container, false);
        mDemoCollectionPagerAdapter = new DemoCollectionPagerAdapter(getFragmentManager());
        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mDemoCollectionPagerAdapter);
        return view;
    }

    @Override
    public void onPause() {
        //This runs when the fragment goes to backstack
        super.onPause();
    }

    @Override
    public void onResume() {
        //This runs when the fragment returns from backstack
        super.onResume();
    }
}

ViewPagerAdapter:

public class DemoCollectionPagerAdapter extends
        FragmentStatePagerAdapter {
    public DemoCollectionPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int i) {
        Fragment fragment = new DemoObjectFragment();
        Bundle args = new Bundle();
        args.putInt(DemoObjectFragment.ARG_OBJECT, i + 1);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        return "OBJECT " + (position + 1);
    }
}

在每个这样的片段,我可以创建新的主片段,一个新的列表显示在ViewPager并更换新片段的内容。

Inside each of this fragments I can create a new Main fragment with a new list to display in the ViewPager and replace the content with this new fragment.

ViewPager片段:

public static class DemoObjectFragment extends Fragment {
    public static final String ARG_OBJECT = "object";

    @Override
    public View onCreateView(LayoutInflater inflater,
            ViewGroup container, Bundle savedInstanceState) {

        View rootView = inflater.inflate(
                R.layout.fragment_collection_object, container, false);
        Bundle args = getArguments();
        ((TextView) rootView.findViewById(android.R.id.text1)).setText(
                Integer.toString(args.getInt(ARG_OBJECT)));
             //Setup components

        return rootView;
    }   

    @Override
    public void setMenuVisibility(final boolean visible) {
        if (visible) {
            //Do something
        }
        super.setMenuVisibility(visible);
    }

    @Override
    public void onPause() {
        //This should run when the fragment goes to backstack
        super.onPause();
    }

    @Override
    public void onResume() {
        //This should run when the fragment returns from backstack
        super.onResume();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.someComponent:
            Fragment newContent = new CollectionDemoFragment();
            switchContent(newContent, true);
            break;
        }
    }

    public void switchContent(Fragment newContent, boolean addToBackStack) {
        if (newContent != null) {
            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
            ft.replace(R.id.content_frame, newContent);
            if (addToBackStack) {
                ft.addToBackStack("" + newContent.getId());
            }
            ft.commit();
        }
    }
}

这工作正常,直到我preSS回来,并从backstack的previous主要片段的回报。

This works ok, until I press back and the previous main fragment returns from the backstack.

该屏幕是空的(因为onCreateView不叫布局不膨胀),从ViewPager片段生命周期方法从来不被称为既可以当主碎片进入backstack,也不当它返回。 堪称ViewPager的片段的唯一方法是setMenuVisibility(),因此,只有code在那里奔跑。

The screen is empty (since onCreateView is not called the layout is not inflated), the lifecycle methods from the fragments in the ViewPager are never called either when the main fragment enters the backstack, nor when it returns . The only method called in the fragments of the ViewPager is the setMenuVisibility() so, only the code in there runs.

任何人都知道一个方法来解决这个问题,为什么出现这种情况?

Anyone knows a way to fix this and why this happens?

不知道它的问题,但我因为Android 2.3的支持。

Not sure if it matters but I have to support since android 2.3.

推荐答案

在创建视图适配器:

mDemoCollectionPagerAdapter = new DemoCollectionPagerAdapter(getFragmentManager());

您必须通过片段子管理者的说法 - 而不是getFragmentManager()getChildFragmentManager()

You have to pass the fragment child manager as argument - getChildFragmentManager() instead of getFragmentManager().

这篇关于ActionBarSherlock与ViewPager没有要求ViewPager碎片会从backstack返回时,生命周期方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆