【问题标题】:Android ViewPager not displaying properly after returning fragment from backStack从 backStack 返回片段后,Android ViewPager 无法正确显示
【发布时间】:2016-01-09 02:12:51
【问题描述】:

我有一个 ViewPager 设置,它使用片段来显示不同的图标,我可以循环浏览,以便用户可以浏览不同的菜单选项。

ViewPager 中的每个项目都位于一个 Fragment 中,如下所示:

public static Fragment newInstance(MainHandheldActivity context, int pos)
{
    Bundle b = new Bundle();
    b.putInt("pos", pos);
    return Fragment.instantiate(context, ObjectFragment.class.getName(), b);
}

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

    // Get menu image icons
    int icons[] = new int[3];
    icons[0] = R.mipmap.ic_text;
    icons[1] = R.mipmap.ic_voice;
    icons[2] = R.mipmap.ic_mail;

    // Get root view of the fragment layout
    LinearLayout rootView = (LinearLayout) inflater.inflate(
            R.layout.fragment_collection_object, container, false);
    Bundle args = getArguments();
    int pos = args.getInt("pos");

    // Set the current menu image and text
    ImageView menuImg = (ImageView) rootView.findViewById(R.id.fragment_image);
    menuImg.setImageResource(icons[pos]);

    TextView menuText = (TextView) rootView.findViewById(R.id.menuTxt);
    switch (pos){
        case 0:
            menuText.setText(MENU_HEADER_TEXT);
            break;
        case 1:
            menuText.setText(MENU_HEADER_VOICE);
            break;
        case 2:
            menuText.setText(MENU_HEADER_MAIL);
            // TODO Get number of messages and concatenate to string eg Inbox (3)
            break;
    }

    // Set the current menu selection
    MainActivityInterface ai = (MainActivityInterface) getActivity();
    ai.setCurrentSelection(pos);
    return rootView;
}

这些片段由页面适配器使用,如下所示:

public class CollectionPageAdapter extends FragmentPagerAdapter implements
        ViewPager.OnPageChangeListener {

    private MainHandheldActivity context;
    private FragmentManager fm;

    public CollectionPageAdapter(MainHandheldActivity context, FragmentManager fm) {
        super(fm);
        this.fm = fm;
        this.context = context;
    }

    @Override
    public Fragment getItem(int position)
    {
        position = position % MainHandheldActivity.PAGES;
        Log.d("POS", "POSITION: " + position);
        return ObjectFragment.newInstance(context, position);
    }

    @Override
    public int getCount()
    {
        return MainHandheldActivity.PAGES * MainHandheldActivity.LOOPS;
    }
}

所有这些都包含在另一个片段中,该片段在其 onCreateView 方法中设置了适配器:

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

        // ... //

        // Scrolling menu
        pager = (ViewPager) view.findViewById(R.id.pager);
        adapter = new CollectionPageAdapter((MainHandheldActivity)getActivity(),getFragmentManager());
        pager.setAdapter(adapter);
        pager.addOnPageChangeListener(adapter);
        // Set current item to the middle page
        pager.setCurrentItem(MainHandheldActivity.FIRST_PAGE);
        currentPage = MainHandheldActivity.FIRST_PAGE;
        // Set number of pages
        pager.setOffscreenPageLimit(3);
        // Set no margin so other pages are hidden
        pager.setPageMargin(0);

        // ... //
}

这个外部片段像这样添加到事务中:

mFragmentManagerer = getSupportFragmentManager();
mFragmentTransaction = mFragmentManagerer.beginTransaction();
mMainFragment = new MainFragment();
mFragmentTransaction.add(R.id.fragmentContainer, mMainFragment, FRAG_MAIN);
mFragmentTransaction.commit();
mFragmentManagerer.executePendingTransactions();

因此,在我的外部导航菜单片段中使用我的 ViewPager 片段时,当我从 ViewPager 中选择一个项目时,我会将整个外部导航菜单放在 backStack 上:

public void replaceFragment(Fragment frag, String fragTag) {
    mFragmentTransaction = mFragmentManagerer.beginTransaction();
    mFragmentTransaction.replace(R.id.fragmentContainer, frag, fragTag);
    mFragmentTransaction.addToBackStack(null);
    mFragmentTransaction.commit();
}

到目前为止,这一切都很好。但是,从 backStack 返回后(当我按下手机上的后退按钮时),viewPager 不显示图标,但它仍然允许我循环浏览 viewPager,并且在循环浏览 2 或 3 个项目后,图标再次出现。有谁知道为什么会发生这种情况?我有点不确定当它们被放置在 backStack 上并从 backStack 中检索时,它们到底发生了什么。谢谢。

【问题讨论】:

    标签: android android-fragments android-viewpager


    【解决方案1】:

    解决了!

    几个小时后,我终于解决了这个问题。我找到here 的解决方案只是在设置适配器时将“getFragmentManager()”替换为“getChildFragmentManager()”:

    pager = (ViewPager) view.findViewById(R.id.pager);
    
    // Added getChildFragmentManager in here
    adapter = new CollectionPageAdapter((MainHandheldActivity)getActivity(),getChildFragmentManager());
    
    pager.setAdapter(adapter);
    pager.addOnPageChangeListener(adapter);
    // Set current item to the middle page
    pager.setCurrentItem(MainHandheldActivity.FIRST_PAGE);
    Log.d("PAGER", "pager setCurrentItem: " + MainHandheldActivity.FIRST_PAGE);
    currentPage = MainHandheldActivity.FIRST_PAGE;
    // Set number of pages
    pager.setOffscreenPageLimit(3);
    // Set no margin so other pages are hidden
    pager.setPageMargin(0);
    

    【讨论】:

    • ffs!就是这样!
    • 救了我的命
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 2012-12-30
    相关资源
    最近更新 更多