简体   繁体   中英

Viewpager is not visible inside fragment

I have a BottomNavigation bar in main activity. Which has 5 items.

Here is the getitem method for that bottomnavigation

 @Override
    public Fragment getItem(int position) {
        switch (position){
            case 0:
                return new ChatRoomPage();
            case 1:
                return new TopicPage();
            case 2:
                return new TopicPage();
            case 3:
                return new Leaderboard();
            case 4:
                return new Stats();
        }
        return new ChatRoomPage();
    }

I have added TopicPage() for testing.

So topic page is a fragment with tab layout. And that fragment shows three other fragments using tab view.

TopicPage() in case 2 is working fine.

But in case 3 fragment TopicPage() is showing. It's also calling the three fragments in tab layout (Getting message in log). But not visible in ViewPager. And the underline on tablayout is not sliding from one tab to another tab with animaton. I have to slide it manually.

And,

When I add a single fragment like Stats() or Leaderboard() it works.

Screenshot SS

Topic Page onCreateview

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    v = inflater.inflate(R.layout.topic_page, container, false);
    tabLayout = v.findViewById(R.id.tab);
    pager = v.findViewById(R.id.pager);
    pager.setOffscreenPageLimit(4);
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
    pager.setAdapter(new TopicPagerAdapter(getFragmentManager()));
    tabLayout.setupWithViewPager(pager);
    return v;
}

So I don't know why I am getting this problem...

Need Help :(

Would you mind trying this. When showing Fragments inside another Fragment, use getChildFragmentManager() instead of getSupportFragmentManager() Initialize your pageAdapter this way:

 pageAdapter = new FragmentHomeAdapter(getChildFragmentManager(), pageList); 

Override a method in TopicPage() fragment called setUserVisibilityHint() and in that method after the return statement ...write if(getActivity()!=null) { viewPager.setAdapter(....youradapter); } if(getActivity()!=null) { viewPager.setAdapter(....youradapter); } I think it will work. First initialize the adapter of viewPager then set the adapter.....Let me know if it works..

MainActivity

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
    tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
    tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));
    tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

    final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
    final PagerAdapter adapter = new PagerAdapter
            (getSupportFragmentManager(), tabLayout.getTabCount());
    viewPager.setAdapter(adapter);
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
}

PagerAdapter For Fragment

public class PagerAdapter extends FragmentStatePagerAdapter {
int mNumOfTabs;

public PagerAdapter(FragmentManager fm, int NumOfTabs) {
    super(fm);
    this.mNumOfTabs = NumOfTabs;
}

@Override
public Fragment getItem(int position) {

    switch (position) {
        case 0:
            TabFragment1 tab1 = new TabFragment1();
            return tab1;
        case 1:
            TabFragment2 tab2 = new TabFragment2();
            return tab2;
        case 2:
            TabFragment3 tab3 = new TabFragment3();
            return tab3;
        default:
            return null;
    }
}

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

FirstFragment

public class TabFragment1 extends Fragment {
 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
Bundle savedInstanceState) {
    return inflater.inflate(R.layout.tab_fragment_1, container, false);
}

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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