【问题标题】:TabLayout with ViewPager not working inside fragment Android带有 ViewPager 的 TabLayout 在片段 Android 中不起作用
【发布时间】:2015-12-23 04:10:53
【问题描述】:

您好,我在片段中有一个 TabLayout 和 ViewPager。但是我不能在标签之间滑动到子片段(在活动中正常工作但在片段中不工作)。

这是我在片段内的 Tablayout 代码:

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

        View inflateView = inflater.inflate(R.layout.fragment_assign_beacon_to_event, container, false);

        //Viewpager and TabLayout
        viewPager = (ViewPager)inflateView.findViewById(R.id.viewPager);
        viewPager.setAdapter(new CustomAdapter(getFragmentManager(), getContext()));

        tabLayout = (TabLayout)inflateView.findViewById(R.id.tabLayout);


        // Inflate the layout for this fragment
        return inflateView;
    }

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

    tabLayout.post(new Runnable() {
                @Override
                public void run() {
                    tabLayout.setupWithViewPager(viewPager);

            }
        });

        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }
        });

Any here is my Custom Adapter class

private class CustomAdapter extends FragmentPagerAdapter {

        private String fragments[] = {"Assign Event", "Manage Event"};

        public CustomAdapter(FragmentManager supportFragmentManager, Context applicationContext) {
            super(supportFragmentManager);
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 0:
//                    return new AssignEventToBeacon();
                    return new Test1();
                case 1:
                    return new ManageEventAssigned();
                default:
                    return null;
            }
        }

        @Override
        public int getCount() {
            return fragments.length;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return fragments[position];
        }

    }

我怀疑这行有问题:

viewPager.setAdapter(new CustomAdapter(getFragmentManager(), getContext()));

非常感谢任何帮助,谢谢

【问题讨论】:

  • 请尝试一下 viewPager.setAdapter(new CustomAdapter(getSupportFragmentManager(), getContext())); // getSupportFragmentManager() 或 getChildFragmentManager()
  • 看这个问题有你想要的一切。 stackoverflow.com/q/34015117/2404262
  • 感谢您的回复。我都试过了,但没有奏效。无论如何要让 tablayout 和 ViewPager 在片段中与在活动中一样工作?
  • 有人知道如何让tablayout和viewpager在fragment中工作吗?

标签: android android-fragments android-viewpager android-tablayout


【解决方案1】:

我做了一个类似的项目,这是我的片段代码:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.outer_fragment, container, false);
        setHasOptionsMenu(true);

        ViewPager viewPager = (ViewPager) view.findViewById(R.id.viewpager);
        if (viewPager != null) {
            setupViewPager(viewPager);
        }

        Log.v("Layout","Tabs");
        TabLayout tabLayout = (TabLayout) view.findViewById(R.id.tabs);
        tabLayout.setSelectedTabIndicatorColor(Color.parseColor("#FFFFFF"));
        tabLayout.setTabTextColors(Color.parseColor("#707070"), Color.parseColor("#FFFFFF"));
        assert viewPager != null;
        tabLayout.setupWithViewPager(viewPager);

        return view;
    }

private void setupViewPager(ViewPager viewPager) {
        Adapter adapter = new Adapter(getChildFragmentManager());
        adapter.addFragment(new Tab1Fragment(), "PHOTOS");
        adapter.addFragment(new Tab2Fragment(), "HI-FIVES");
        viewPager.setAdapter(adapter);
    }


static class Adapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragments = new ArrayList<>();
        private final List<String> mFragmentTitles = new ArrayList<>();

        public Adapter(FragmentManager fm) {
            super(fm);
        }

        public void addFragment(Fragment fragment, String title) {
            mFragments.add(fragment);
            mFragmentTitles.add(title);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragments.get(position);
        }

        @Override
        public int getCount() {
            return mFragments.size();
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitles.get(position);
        }
    }

【讨论】:

  • 非常感谢。解决方案是我们应该使用 getchildFragmentManager。但是我仍然有一个问题,我们应该将所有可执行代码放在 OncreateView 中还是将一些移到 OnActivityCreated 中?我希望片段仅在用户滑动到该片段时才执行[现在它们所有片段同时加载
  • 您应该在onCreateView() 中扩充您的视图,并在onCreateView() 或onActivityCreated() 中进行任何您想做的处理。只要记住在你打电话给getActivity()之前做if(isAdded())
  • 我仍然混淆 getContext 和 getActivity。什么时候使用其中一个?您是否有示例仅在用户滑动到片段时才加载片段?
  • 尝试使用getActivity()。我不完全确定getContext()。你说的负载是什么意思?查看视图是在onCreateView() 中创建的,无论您加载的是什么代码,都会在调用您放置该代码的相应方法时运行。如需更多信息,请参阅Fragment Lifecycle。
  • 我的意思是当我将子片段代码放在 OnActivityCreated 上时,子片段中的代码 [例如 Toast 消息] 在用户单击父片段 [具有 tablayout] 后立即执行。有没有办法让子片段代码只在用户滑动到子片段时执行?
【解决方案2】:

您需要在 Fragment 中使用 getChildFragmentManager() 而不是 getFragmentManager()。

来自getChildFragmentManager() documentation

返回一个私有的 FragmentManager 用于放置和管理 Fragment 在这个 Fragment 内部。

来自getFragmentManager() documentation

返回 FragmentManager 用于与关联的 Fragment 进行交互 与此片段的活动。

简单来说,

  • 将getChildFragmentManager() 用于子片段
  • 将getFragmentManager() 用于Activity 中的片段

完整代码可以看@this answer。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多