how - Android TabLayout dentro de Fragment
tabs bottom android example (6)
Estoy usando Navigation Drawer
para navegar entre fragmentos, todos usan la barra de herramientas MainActivity, pero cada fragmento tiene su propia TabLayout
con 3 pestañas y en cada pestaña TabLayout
RecyclerView
para mostrar diferentes textos e imágenes.
Lo hice esta última vez usando actvities en lugar de fragmentos, pero ahora usando el cajón es mejor usar fragmentos.
Llegué a un punto en el que las pestañas funcionan, pero tan pronto como coloco el ViewPager
y conecto los adaptadores a las pestañas y abro el nuevo fragmento del cajón obtengo un apuntador nulo, ¿cuál podría ser el problema aquí?
MainActivity.java
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
}
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
return id == R.id.action_settings || super.onOptionsItemSelected(item);
}
@Override
public boolean onNavigationItemSelected(MenuItem item) {
int id = item.getItemId();
Fragment fragment;
if (id == R.id.fragment_one) {
fragment = new NewFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.container, fragment);
ft.commit();
} else if (id == R.id.fragment_two) {
fragment = new NewFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.container, fragment);
ft.commit();
} else if (id == R.id.fragment_three) {
fragment = new NewFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.container, fragment);
ft.commit();
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
}
activity_main.xml
<android.support.v4.widget.DrawerLayout xmlns: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.CoordinatorLayout xmlns: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:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="com.xcandy.guideforfifa17.MainActivity">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<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/AppTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout>
<include layout="@layout/content_main" />
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.NavigationView
android: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>
NewFragment.java
public class NewFragment extends Fragment {
private RecyclerView mRecyclerView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_fragment_one, container, false);
TabLayout tabLayout = (TabLayout) view.findViewById(R.id.tabs);
tabLayout.addTab(tabLayout.newTab().setText("A"));
tabLayout.addTab(tabLayout.newTab().setText("B"));
tabLayout.addTab(tabLayout.newTab().setText("C"));
final ViewPager viewPager = (ViewPager) view.findViewById(R.id.viewpager);
mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
mRecyclerView.setLayoutManager(mLayoutManager);
viewPager.setAdapter(new PagerAdapter
(getFragmentManager(), tabLayout.getTabCount()));
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) {
}
});
return view;
}
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:
RecyclerView.Adapter mAdapter = new AdapterOne();
mRecyclerView.setAdapter(mAdapter);
case 1:
mAdapter = new AdapterTwo();
mRecyclerView.setAdapter(mAdapter);
case 2:
mAdapter = new AdapterThree();
mRecyclerView.setAdapter(mAdapter);
default:
return null;
}
}
@Override
public int getCount() {
return mNumOfTabs;
}
}
}
activity_fragment.xml
<android.support.design.widget.CoordinatorLayout xmlns: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:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".NewFragment">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabMode="fixed"
app:tabGravity="fill"/>
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</android.support.design.widget.CoordinatorLayout>
Registro de errores
--------- beginning of crash
06-23 11:19:56.985 2466-2466/com.candyx.sims E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.candyx.sims, PID: 2466
java.lang.NullPointerException: Attempt to invoke virtual method ''void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)'' on a null object reference
at com.candyx.sims.BlankFragment.onCreateView(BlankFragment.java:38)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
06-23 11:23:14.912 5839-5873/com.candyx.sims D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
[ 06-23 11:23:14.920 5839: 5839 D/ ]
HostConnection::get() New Host Connection established 0xb4125190, tid 5839
06-23 11:23:14.927 5839-5839/com.candyx.sims D/Atlas: Validating map...
06-23 11:23:15.011 5839-5873/com.candyx.sims I/OpenGLRenderer: Initialized EGL, version 1.4
06-23 11:23:15.027 5839-5873/com.candyx.sims D/OpenGLRenderer: Enabling debug mode 0
06-23 11:23:15.039 5839-5873/com.candyx.sims W/EGL_emulation: eglSurfaceAttrib not implemented
06-23 11:23:15.039 5839-5873/com.candyx.sims W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xae838600, error=EGL_SUCCESS
06-23 11:23:16.444 5839-5839/com.candyx.sims W/PathParser: Points are too far apart 4.000000596046461
06-23 11:23:17.342 5839-5839/com.candyx.sims W/PathParser: Points are too far apart 4.000000596046461
06-23 11:23:17.350 5839-5839/com.candyx.sims I/AppCompatViewInflater: app:theme is now deprecated. Please move to using android:theme instead.
06-23 11:23:17.369 5839-5839/com.candyx.sims D/AndroidRuntime: Shutting down VM
06-23 11:23:17.369 5839-5839/com.candyx.sims E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.candyx.sims, PID: 5839
java.lang.NullPointerException: Attempt to invoke virtual method ''void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)'' on a null object reference
at com.candyx.sims.NewFragment.onCreateView(NewFragment.java:38)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
06-23 11:25:16.961 7518-7518/com.candyx.sims W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
06-23 11:25:17.078 7518-7548/com.candyx.sims D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
[ 06-23 11:25:17.081 7518: 7518 D/ ]
HostConnection::get() New Host Connection established 0xb412a1f0, tid 7518
06-23 11:25:17.082 7518-7518/com.candyx.sims D/Atlas: Validating map...
06-23 11:25:17.109 7518-7548/com.candyx.sims I/OpenGLRenderer: Initialized EGL, version 1.4
06-23 11:25:17.126 7518-7548/com.candyx.sims D/OpenGLRenderer: Enabling debug mode 0
06-23 11:25:17.134 7518-7548/com.candyx.sims W/EGL_emulation: eglSurfaceAttrib not implemented
06-23 11:25:17.134 7518-7548/com.candyx.sims W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xb41234c0, error=EGL_SUCCESS
06-23 11:25:31.030 7518-7518/com.candyx.sims W/PathParser: Points are too far apart 4.000000596046461
06-23 11:25:32.174 7518-7518/com.candyx.sims W/PathParser: Points are too far apart 4.000000596046461
06-23 11:25:32.187 7518-7518/com.candyx.sims I/AppCompatViewInflater: app:theme is now deprecated. Please move to using android:theme instead.
06-23 11:25:32.207 7518-7518/com.candyx.sims D/AndroidRuntime: Shutting down VM
06-23 11:25:32.207 7518-7518/com.candyx.sims E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.candyx.sims, PID: 7518
java.lang.NullPointerException: Attempt to invoke virtual method ''void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)'' on a null object reference
at com.candyx.sims.NewFragment.onCreateView(NewFragment.java:38)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Este método getItem
en PagerAdapter
equivocado, devuelve Fragment
init Debería devolver Fragment
. Y en fragmento, estableces setView
recyclerView
en él
Sin los registros de errores, es difícil decir dónde y por qué obtienes la NullPointerException
.
Lo primero que me llamó la atención es que no vinculó su TabLayout
y ViewPager
. Use el siguiente código después de configurar el adaptador para ViewPager
:
// setUpWithViewPager doesn''t work without using a Runnable interface.
// Support library bug, maybe?
tabLayout.post(new Runnable() {
@Override
public void run() {
tabLayout.setupWithViewPager(viewPager);
}
});
No estoy seguro de si este es el problema, pero pruébalo :)
Bueno, hace algún tiempo implementé exactamente el mismo diseño de aplicación. Tenía un fragmento, destinado a contener pestañas y ViewPager. Esa fue una tarea difícil, y recuerdo que tuve problemas similares a los tuyos. Así es como lo resolví:
La secuencia de diseño es:
Activity -> Fragment -> Tab Layout + ViewPager -> FragmentStatePagerAdapter -> Fragment -> RecyclerView
No tienes nada que ver con tu actividad principal. Todo el material está en fragmentos. Así que deshazte de TabLayout en tu activity_main.xml
.
Tendrá que lidiar con fragmentos anidados dentro del buscapersonas. Todo el contenido de la página debe estar allí y TabLayout debe estar en el mismo diseño donde está ViewPager.
Mi proyecto es un poco viejo, y usé android.support.v4.app.Fragment
en caso de que tenga sentido. Eliminé las fuentes de los datos que no necesita, por lo que puede ver que se refiere a algunos métodos huérfanos.
La tarea consistía en mostrar la lista de precios con categorías y presentar los productos de cada categoría en su propia página, de modo que los deslizamientos horizontales cambiarían las categorías y los deslizamientos verticales: enumerar productos.
Cada fragmento con ViewPager y TabLayout tiene el siguiente subfragment_price_list_pager.xml
layout:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns: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:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/icons"
app:cardCornerRadius="4dp"
app:cardElevation="4dp"
app:cardPreventCornerOverlap="true">
<android.support.v7.widget.Toolbar
android:id="@+id/priceListToolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:elevation="4dp"
android:theme="@style/AppTheme.Toolbar.TabLayout"
app:navigationIcon="@drawable/ic_tag_multiple_grey600_24dp"
tools:ignore="UnusedAttribute">
<android.support.design.widget.TabLayout
android:id="@+id/tabBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
</android.support.v7.widget.Toolbar>
<android.support.v4.view.ViewPager
android:id="@+id/priceList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="58dp"
android:padding="5dp"
android:scrollbars="horizontal" />
</android.support.v7.widget.CardView>
Aquí está el PriceListPagerFragment.class
:
public class PriceListPagerFragment extends Fragment {
private static final String TAG = "PriceListPagerFragment";
private PriceList mPriceList;
private ViewPager mCategoriesViewPager;
private TabLayout tabLayout;
private Loader<PriceList> priceListLoader;
private EditText scanerBarcodeText;
private OnCartActionListener mListener;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.subfragment_price_list_pager, container, false);
// Pager that would be inflated with page fragments.
mCategoriesViewPager = (ViewPager) rootView.findViewById(R.id.priceList);
tabLayout = (TabLayout) rootView.findViewById(R.id.tabBar);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
// Do all the stuff with pager here:
updatePriceListPages();
return rootView;
}
private void updatePriceListPages() {
if (mCategoriesViewPager != null && mPriceList != null) {
Log.d(TAG, this + "updatePriceListPages");
if (mCategoriesViewPager.getAdapter() == null) {
PriceListCategoriesAdapter adapter = new PriceListCategoriesAdapter(
getFragmentManager(),
tabLayout
);
mCategoriesViewPager.setAdapter(
adapter
);
// Each page is a content of a single category of one-level catalog
// We did not supply catalog to adapter before it is bound to ViewPager for some serious reason which I can''t recall now
adapter.setPriceList(mPriceList);
tabLayout.setupWithViewPager(mCategoriesViewPager);
} else {
((PriceListCategoriesAdapter) mCategoriesViewPager.getAdapter()).setPriceList(mPriceList);
}
}
}
}
Implementación personalizada de FragmentStatePagerAdapter
, PriceListCategoriesAdapter.class
:
public class PriceListCategoriesAdapter extends FragmentStatePagerAdapter {
private static final String TAG = "PriceListCategoriesAd";
private final TabLayout mTabLayout;
private FragmentManager mFm;
private Vector<PriceListFragment> recyclerViewList;
private Vector<String> titles;
public PriceListCategoriesAdapter(FragmentManager fm, TabLayout tabLayout) {
super(fm);
mFm = fm;
mTabLayout = tabLayout;
recyclerViewList = new Vector<>();
titles = new Vector<>();
}
// All the magic with nested page fragments is done here
public void setPriceList(PriceList priceList) {
boolean updateTabs = false;
Vector<String> newTitles = new Vector<>();
int position = 0;
for (CatalogItem catalogItem : priceList.getCatalogs()) {
if (catalogItem.getProducts() == null)
continue;
boolean newFragment;
PriceListFragment fragment;
try {
fragment = recyclerViewList.get(position);
newFragment = false;
} catch (ArrayIndexOutOfBoundsException e) {
fragment = new PriceListFragment();
newFragment = true;
}
fragment.setCatalogItem(catalogItem);
newTitles.add(catalogItem.getName());
if (newFragment) {
recyclerViewList.add(fragment);
}
position++;
}
if (titles.size() != newTitles.size()) {
updateTabs = true;
} else {
for (int position = 0; position < titles.size(); position++) {
if (!titles.get(position).equals(newTitles.get(position))) {
updateTabs = true;
break;
}
}
}
titles = newTitles;
notifyDataSetChanged();
if (updateTabs)
mTabLayout.setTabsFromPagerAdapter(this);
}
@Override
public Fragment getItem(int position) {
return recyclerViewList.get(position);
}
@Override
public int getItemPosition(Object object) {
PriceListFragment fragment = (PriceListFragment) object;
String title = (String) fragment.getTitle();
int position = titles.indexOf(title);
if (position >= 0) {
return position;
} else {
return POSITION_NONE;
}
}
@Override
public int getCount() {
return titles.size();
}
@Override
public CharSequence getPageTitle(int position) {
return recyclerViewList.get(position).getTitle();
}
// We don''t keep states
@Override
public Parcelable saveState() {
return null;
}
// We don''t keep states
@Override
public void restoreState(Parcelable state, ClassLoader loader) {
}
}
Y finalmente el diseño de PriceListFragment
:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView android:id="@+id/categoryList"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical" />
PriceListFragment.class
sí no tiene nada de especial. Simplemente crea una instancia de RecyclerView con la información adecuada.
Después de examinar el código de su propiedad, descubrí que se olvidó de devolver un fragmento en el método getItem de PagerAdapter que anuló del FragmentStatePagerAdapter y que no hay ninguna declaración de interrupción en cada caso debido a que cada vez que se devuelve un valor nulo.
Para hacerlo, necesita crear otro fragmento nuevo para cada página en ViewPager o puede crear un nuevo fragmento que podría usar en todas las páginas de ViewPager.
No puede usar la misma vista de reciclador en las pestañas del buscapersonas que ha definido en el fragmento principal.
activity_fragment_one.xml
<android.support.design.widget.CoordinatorLayout xmlns: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:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".NewFragment">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
app:tabTextAppearance="?android:attr/textAppearanceMedium"
app:tabTextColor="#ffffff"
android:layout_height="?android:actionBarSize"
app:tabMode="fixed"
app:tabGravity="fill"/>
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:background="@android:color/white"/>
</android.support.design.widget.CoordinatorLayout>
He arreglado tu fragmento y he creado un nuevo Fragmento que puedes usar en ViewPager Pages.
public class NewFragment extends Fragment {
private RecyclerView mRecyclerView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_fragment_one, container, false);
TabLayout tabLayout = (TabLayout) view.findViewById(R.id.tabs);
tabLayout.addTab(tabLayout.newTab().setText("A"));
tabLayout.addTab(tabLayout.newTab().setText("B"));
tabLayout.addTab(tabLayout.newTab().setText("C"));
final ViewPager viewPager = (ViewPager) view.findViewById(R.id.viewpager);
// mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
//mRecyclerView.setLayoutManager(mLayoutManager);
viewPager.setAdapter(new PagerAdapter(getFragmentManager(), tabLayout.getTabCount()));
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.setupWithViewPager(viewPager);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
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) {
}
});
return view;
}
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:
return new FragmentTab();
case 1:
return new FragmentTab();
case 2:
return new FragmentTab();
default:
return null;
}
}
@Override
public int getCount() {
return mNumOfTabs;
}
}
}
FragmentTab para cada página en el Buscapersonas de la Vista (o puede crear diferentes fragmentos para cada página de acuerdo con sus necesidades).
public class FragmentTab extends Fragment {
RecyclerView mRecyclerView;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_tab, container, false);
mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(mLayoutManager);
RecyclerView.Adapter mAdapter = new AdapterOne();
mRecyclerView.setAdapter(mAdapter);
return view;
}
}
fragment_tab.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</LinearLayout>
sugiero usar getChildFragmentManager
lugar de getFragmentManager
en
viewPager.setAdapter(new PagerAdapter (getFragmentManager(), tabLayout.getTabCount()));
Utilice getChildFragmentManager()
lugar de getSupportFragmentManager()