Skip to content Skip to sidebar Skip to footer

Viewpager Tabs Fragment & Normal Fragments

I apologize in beforehand for my bad code and bad knowledge. I have just recently started coding in Android and Java My problem is that I have Navigation Drawer and Tabs. Although

Solution 1:

The problem with your code is that your ViewPager with TabLayout should be part of the Fragment, not part of the Activity. And NavigationDrawer should just replace one fragment by another in the viewport (i.e. in the container). Now, in your code, you're trying to somehow insert your new Fragment into the ViewPager.

Here's a very basic app with Navigation Drawer, one Fragment with Tabs and rest fragments without tabs, which you can use as an example:

enter image description here

Activity.xml:

<android.support.v4.widget.DrawerLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/drawer_layout"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"tools:openDrawer="start"><android.support.design.widget.CoordinatorLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"><android.support.design.widget.AppBarLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:theme="@style/AppTheme.AppBarOverlay"><android.support.v7.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"android:background="?attr/colorPrimary"app:popupTheme="@style/AppTheme.PopupOverlay" /></android.support.design.widget.AppBarLayout><FrameLayoutandroid:id="@+id/fragmentContainer"android:layout_marginTop="?attr/actionBarSize"android:layout_width="match_parent"android:layout_height="match_parent"/></android.support.design.widget.CoordinatorLayout><android.support.design.widget.NavigationViewandroid:id="@+id/nav_view"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_gravity="start"android:fitsSystemWindows="true"app:headerLayout="@layout/nav_header_main"app:menu="@menu/activity_main_drawer" /></android.support.v4.widget.DrawerLayout>

The code in the activity:

publicclassMainActivityextendsAppCompatActivityimplementsNavigationView.OnNavigationItemSelectedListener {

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

        DrawerLayoutdrawer= (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggletoggle=newActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        NavigationViewnavigationView= (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer, newFragmentWithTabs()).commit();
    }

    @OverridepublicvoidonBackPressed() {
        DrawerLayoutdrawer= (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @SuppressWarnings("StatementWithEmptyBody")@OverridepublicbooleanonNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.intid= item.getItemId();

        if (id == R.id.fragment_1) {
            getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer, newFragmentWithTabs()).commit();
        } elseif (id == R.id.fragment_2) {
            getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer, newFragmentWithoutTabs()).commit();
        } elseif (id == R.id.fragment_3) {
            getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer, newFragment()).commit();
        }

        DrawerLayoutdrawer= (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        returntrue;
    }
}

I.e., as you see, I'm replacing fragments in the FrameLayout with id fragmentContainer.

All logic related to the fragment with tabs, incapsulated in FragmentWithTabs:

publicclassFragmentWithTabsextendsFragment {

    @Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ViewrootView= inflater.inflate(R.layout.fragment_with_tabs, container, false);
        ViewPagerviewPager= (ViewPager)rootView.findViewById(R.id.viewPager);
        TabLayouttabLayout= (TabLayout)rootView.findViewById(R.id.tabLayout);

        viewPager.setAdapter(newFragmentPagerAdapter(getChildFragmentManager()) {
            @Overridepublic Fragment getItem(int position) {
                returnnewSubFragment(position == 0? Color.BLUE : position == 1? Color.WHITE : Color.RED);
            }

            @Overridepublic CharSequence getPageTitle(int position) {
                return position+"";
            }

            @OverridepublicintgetCount() {
                return3;
            }
        });

        tabLayout.setupWithViewPager(viewPager);
        return rootView;
    }
}

I hope, it helps

Post a Comment for "Viewpager Tabs Fragment & Normal Fragments"