【问题标题】:Reload Nested Fragments inside Fragment using ViewPager使用 ViewPager 在 Fragment 中重新加载嵌套的 Fragments
【发布时间】:2015-11-15 15:50:58
【问题描述】:

我有一个带有片段的活动,在一个片段内我嵌套了 3 个其他片段,我使用 viewpager 在它们之间导航,但是当我想更改这个包含嵌套片段的“主片段”时,我调用 transaction.replace 和它更改了片段,但是当我回到这个片段时,嵌套片段不再显示,每次启动片段时如何重新加载它们? 我试图在我的 xml 布局中实现它们,但它似乎不起作用,我需要帮助!

FragmentWithViewPager:

public class FragmentWithViewPager extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_fragwithviewpager, null);

    mActionBar = getActivity().getActionBar();
    mActionBar.show();
    mActionBar.setTitle("MyFragment");

    mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    mPager = (ViewPager) view
            .findViewById(R.id.MyFragmentMainPager);
    ActionBar.TabListener tabListener = new ActionBar.TabListener() {

        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            mPager.setCurrentItem(tab.getPosition());
            tab.setIcon(tabIcon_active[tab.getPosition()]);
        }

        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
            // /tab.setIcon(null);
            tab.setIcon(tabIcon[tab.getPosition()]);
        }

        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
            // TODO Auto-generated method stub
            tab.setIcon(tabIcon_active[tab.getPosition()]);
        }

    };
    if(mActionBar.getTabCount() < 3){
        for (int i=0; i < tabIcon.length; i++)
        {
        mActionBar.addTab(mActionBar.newTab()
                                 .setIcon(tabIcon[i])
                                 .setTabListener(tabListener));
        }
    }
    mPagerAdapter = new MyFragmentsMainPagerAdapter(getFragmentManager());

    new setAdapterTask().execute();

    return view;
}
rivate class setAdapterTask extends AsyncTask<Void, Void, Void> {
    protected Void doInBackground(Void... params) {
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        mPager.setAdapter(mPagerAdapter);
        mPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                mActionBar.setSelectedNavigationItem(position);
            }
        });
    }
}

【问题讨论】:

    标签: android android-activity transactions fragment


    【解决方案1】:

    具有与 Viewpager 嵌套的其他 3 个 Fragment 的 Fragment 应使用 ChildFragmentManager。

    在您的活动中,您在替换或添加片段的 xml 中有 main_fragment_container。正确的?如果为 true,那么在具有 Viewpager 的 Fragment 中,如果您使用 FragmentPagerAdapter 来陪伴 Viewpager,所有片段事务都会自动为您完成。

    那么,如果您在 main_fragment_container 中替换或添加片段,则根本不会影响 Viewpager 的内容。当您使用 viewpager 重新加载片段时,如果您已将 ChildFragmentManager 传递给 viewpager,那么 viewpager 也会重新加载。

     @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            return inflater.inflate(R.layout.fragment_parent, container, false);
        }
    
        @Override
        public void onViewCreated(View view, Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
    
            ViewPager mViewPager = (ViewPager) view.findViewById(R.id.viewPager);
            mViewPager.setAdapter(new MyAdapter(getChildFragmentManager()));
        }
    
        public static class MyAdapter extends FragmentPagerAdapter {
    
            public MyAdapter(FragmentManager fm) {
                super(fm);
            }
    
            @Override
            public int getCount() {
                return 4;
            }
    
            @Override
            public Fragment getItem(int position) {
                Bundle args = new Bundle();
                args.putInt(TextViewFragment.POSITION_KEY, position);
                return TextViewFragment.newInstance(args);
            }
        }
    

    【讨论】:

    • 我尝试在这个方法中实现 childFragmentManager: mPagerAdapter = new NotificationMainPagerAdapter(getFragmentManager());但它表明该方法不存在
    • 如果在 Fragment 中使用 getChildFragmentManager() 方法不存在?您是否使用支持 V4 库中的片段?附言你是对的,这是你应该通过 ChildFragmentManager
    • 是的,我正在使用 V4 库,与普通或 v13 一样,我无法在片段中使用 viewpager 我尝试将适配器构造函数中的 FragmentManager 更改为 ChildFragmentManager,但这是同样的问题
    • 请贴出有Viewpager的Fragment代码
    • notifView = 查看;我更改了它的名称,以便您更容易阅读
    【解决方案2】:

    隐藏(主片段) 添加(新片段)-> 删除或隐藏(NewFragment) 显示(MainFragment)。

    getSupportFragmentManager().beginTransition().hide(MainFragment).commit().
    getSupportFragmentManager().beginTransition().add(R.id.containerid,MainFragment).commit().
    

    【讨论】:

    • 问题是我的片段可以从任何其他片段访问我有一个带有按钮的滑动菜单,我可以在其中执行事务,我如何识别隐藏(thisfragment)添加(newfragment)?
    • FragmentTransaction 类型中的方法 hide(Fragment) 不适用于参数 (int,MyFragment),它显示了这个广告隐藏方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 2013-04-22
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多