Uso de navigationView con tabLayout

Así que recientemente he estado trabajando en la actualización de mi aplicación para utilizar la nueva biblioteca de soporte de diseño de materiales. Mi aplicación tiene una actividad principal con un dibujo y una vista de navegación. El contenido principal de la aplicación se muestra en un frameLayout, a través de fragmentos. Sin embargo, estoy intentando ahora agregar pestañas de material a uno de los fragmentos del cajón de navegación. Sin embargo, no estoy seguro de cómo implementar esto mientras mantiene mis fragmentos en el funcionamiento del cajón de la nav. Un buen ejemplo de lo que estoy tratando de lograr se muestra a continuación:

Introduzca aquí la descripción de la imagen

En esta aplicación (Google Play Music), sólo algunos de los elementos del cajón de navegación tienen pestañas, mientras que otros no. Así que mi pregunta es, ¿cómo implementaría esto? (No busca código, sólo una visión general de cómo mi diseño debe organizarse)

Para recapitular / aclarar: Tengo un diseño principal con un frameLayout (para el contenido de mi aplicación), y un navigationView (para navegar los diferentes fragmentos de elementos). Entonces tengo un oyente que reemplaza frameLayout de la disposición principal con el fragmento respectivo del artículo. Ahora, necesito agregar pestañas a solo uno de estos fragmentos (para navegar entre 4 otros fragmentos). También estoy utilizando una barra de herramientas que incluyo como un diseño independiente.

Cualquier consejo es apreciado. Lo siento si mi descripción es un poco confuso; Voy a aclarar los detalles necesarios.

No puedo recomendar lo que sugirió Yiyo. Si va a tener Fragmentos con diferentes diseños, debe permitir que los Fragmentos personalizen estos diseños en XML. Esta es la razón por la introducción de la barra de herramientas hizo mucho sentido para el desarrollo de Android. En el futuro, incluso podría tener más requisitos que difieren entre cada fragmento. Algunos de ellos pueden no querer una barra de herramientas, algunos de ellos pueden necesitar otra vista por encima de la barra de herramientas, algunos de ellos tendrán un RecyclerView que le gustaría ser accesible a la CoordinatorLayout y AppBar para que el comportamiento de desplazamiento funciona correctamente.

Te recomiendo que sólo pongas un FrameLayout como el contenido de tu DrawerLayout (como Yiyo se menciona en el punto 1). Aquí cargarás cada fragmento de las devoluciones de llamada del NavigationView.

<android.support.v4.widget.DrawerLayout ... android:fitsSystemWindows="true" > <FrameLayout android:id="@+id/drawer_content" android:layout_width="match_parent" android:layout_height="match_parent"/> <android.support.design.widget.NavigationView ... /> </android.support.v4.widget.DrawerLayout> 

En el XML de cada fragmento pondrás, si así lo requiere ese fragmento, una barra de herramientas. En el XML de tu Fragmento con pestañas pondrás TabLayout, y si lo deseas, el CoordinatorLayout y AppBarLayout. De cada fragmento que tiene una barra de herramientas, establecerá la barra de herramientas como ActionBar:

 Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar); AppCompatActivity activity = (AppCompatActivity) getActivity(); activity.setSupportActionBar(toolbar); 

Eso es todo al respecto. Por supuesto que no quieres repetirte en cada fragmento, por lo que puedes, por ejemplo, poner este código en un DrawerFragment y subclases para fragmentos con una barra de herramientas. También deseará poner la configuración XML de su barra de herramientas en un único archivo e incluirla en el XML del fragmento <include layout="@layout/toolbar" /> . O tal vez desee eliminar la Barra de herramientas de algunos fragmentos, o cambiar su color, tema, etc.

Ok supongamos que su navegador tiene dos opciones, la primera muestra el fragmento con pestañas (tabulación) y la segunda muestra sólo un fragmento con una barra de herramientas. Usted tiene dos opciones entonces:

  1. Usted puede tener un diseño principal con sólo un diseño de marco y reemplazarlo con todo lo que quiere
  2. Puede tener un diseño principal con el diseño del coordinador -> barra de aplicaciones -> barra de herramientas -> diseño de tabulación y un diseño de marco para poner contenido

Yo prefiero la segunda opción para evitar tener que configurar siempre la barra de herramientas por lo que esto es lo que hice una vez:

 <!-- layout_main --> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <android.support.design.widget.CoordinatorLayout xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:layout_scrollFlags="scroll|enterAlways"/> <android.support.design.widget.TabLayout android:id="@+id/tab_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone" app:tabGravity="fill" app:tabMode="fixed" /> </android.support.design.widget.AppBarLayout> <FrameLayout android:id="@+id/main_content" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </android.support.design.widget.CoordinatorLayout> <!-- The NavigationView --> <fragment android:id="@+id/navigation_fragment" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:name="some.path.to.the.NavigationViewFragment" tools:layout="@layout/fragment_navigation_view" /> </android.support.v4.widget.DrawerLayout> 

Como ves, cambio la visibilidad de TabLayout a "gone" para que el fragmento con tabs tenga cuidado de establecer como visible. El Fragmento con las pestañas sólo tiene el ViewPager en el Layout:

 <!-- fragment_with_tabs --> <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent" /> 

Ahora el fragmento con pestañas inicializa el ViewPager con los fragmentos para cada página:

 @Override public onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // The getChildFragmentManager() is Very important! Because fragments inside fragments are // not supported with the tipical fragmentManager, it requires NestedFragments and those // uses a childFragmentManager(). In other case a strange behaviour occurs ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager()); adapter.addFragment(new TabOneFragment(), "Tab 1"); adapter.addFragment(new TabTwoFragment(), "Tab 2"); viewPager.setAdapter(adapter); tabLayout = (TabLayout) getActivity().findViewById(R.id.tab_layout); tabLayout.setVisibility(View.VISIBLE); tabLayout.setupWithViewPager(viewPager); } 

Y finalmente hacer lo que quieras en tu TabFragments, esto funciona bien para mí y espero que esto sea útil para usted también. Lo siento por algún problema con la sintaxis de código, desarrollar Android con Kotlin y no con Java.

Puedes hacerlo así. He comprobado por hacerlo yo mismo y funciona muy bien

Paso 1: Crear un diseño de su actividad principal como esta

  <android.support.design.widget.AppBarLayout android:id="@+id/appBarLayout" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/blue" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" android:titleTextAppearance="@style/TextAppearance.AppCompat.Small" app:layout_scrollFlags="scroll|enterAlways" /> <android.support.design.widget.TabLayout android:id="@+id/tab_layout" style="@style/FreeWiFiTabLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:background="@color/blue" android:visibility="gone" android:fitsSystemWindows="true" android:minHeight="?attr/actionBarSize" /> </android.support.design.widget.AppBarLayout> <android.support.v4.view.ViewPager android:id="@+id/wifi_type_pager" android:layout_width="match_parent" android:layout_height="match_parent" android:clipToPadding="false" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </android.support.design.widget.CoordinatorLayout> <fragment android:id="@+id/navigation_drawer" android:name="com.easyway.freewifi.NavigationDrawerFragment" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start|bottom" android:layout_marginTop="?attr/actionBarSize" tools:layout="@layout/navigation_drawer_fragment" /> 

Paso 2 :

En tu actividad debes establecer onpagechangelistener en tu viewpager:

  viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { if(position ==0){ tabLayout.setVisibility(View.GONE); }else{ tabLayout.setVisibility(View.VISIBLE); } } @Override public void onPageScrollStateChanged(int state) { } }); 

Después de esto usted necesita agregar viewPager.addOnPageChangeListener (nuevo TabLayout.TabLayoutOnPageChangeListener (tabLayout));

Paso 3 :

Así es como puede hacer su adaptador para viewpager:

La clase pública WiFiPagerAdapter extiende FragmentPagerAdapter {private final List registeredFragments = new ArrayList <> ();

 public WiFiPagerAdapter(final FragmentManager fm) { super(fm); } @Override public Fragment getItem(final int pos) { Fragment fragment; fragment = WiFiFragment.newInstance(pos); registeredFragments.add(pos, fragment); return fragment; } @Override public int getCount() { return tabLayout.getTabCount(); } public List<Fragment> getRegisteredFragmentsList() { return registeredFragments; } @Nullable public Fragment getRegisteredFragment(final int position) { final Fragment wr = registeredFragments.get(position); if (wr != null) { return wr; } else { return null; } } @Override public void notifyDataSetChanged() { super.notifyDataSetChanged(); for (int i = 0; i < registeredFragments.size(); i++) { WiFiFragment wiFiFragment = ((WiFiFragment) registeredFragments.get(i)); wiFiFragment.setWiFiFragmentRecyclerViewAdapter(); } } 

}

  • ¿Cómo usar dos tamaños de fuente diferentes para texto de botón en Android?
  • ¿Cómo puedo crear elementos de menú dinámicamente?
  • Android: alinear el centro LinearLayout para todos los tamaños de pantalla
  • Redibujar múltiples rutas en las mismas posiciones de la orientación anterior de la disposición
  • Disposición de Android por debajo y por encima
  • Listview la misma altura que el contenido
  • Pasar un parámetro con MvvmCross MvxBind, en ItemClick, utilizando un MvxGridView
  • ¿Por qué añadir <merge> cambia el diseño de Android?
  • Los botones de configuración style = "? Android: attr / buttonBarStyle" a los diseños de los padres y style = "? Android: attr / buttonBarButtonStyle" los hacen invisibles
  • Alineación derecha de Android TextView en un dispositivo de derecha a izquierda
  • RatingBar - Alternar o deshacer
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.