with viewpager tablayout tab iconos con android android-fragments tabs android-tablayout

viewpager - tabs con iconos android



Android TabLayout ViewPager no inflar el fragmento de tabulaciĆ³n en backstack (1)

Cambiar esta public View onCreateView(LayoutInflater inflater,... a public void onViewCreated (View view, Bundle savedInstanceState)

entonces vas a tener algo como esto

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.tab_recycler_holder, container, false); }

entonces

@Override public void onViewCreated (View view, Bundle savedInstanceState){ ButterKnife.bind(this, view); recyclerFab.hide(false); tabPullRefresh.setRefreshStyle(PullRefreshLayout.STYLE_MATERIAL); ...

ver si ayuda

Tengo configurada una vista de pestaña que tiene fragmentos personalizados para cada pestaña usando un visor. Este es mi código:

Sosteniendo el fragmento

public class FragInboxMainView extends Fragment implements CGFragment { private CGController controller; private CGFragment thisFragment; @Bind(R.id.inboxViewPager)ViewPager inboxViewPager; @Bind(R.id.inboxTabs)TabLayout inboxTabLayout; @Bind(R.id.inbox_progress_wheel)ProgressWheel inboxProgressWheel; public FragInboxMainView(){} @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_inbox_mainview, container, false); ButterKnife.bind(this, rootView); thisFragment = this; Globals g = Globals.getInstance(); /** Show loading spinner */ this.inboxProgressWheel.setBarColor(ContextCompat.getColor(controller.getContext(), g.getUserObject().getUserThemeColor())); this.inboxProgressWheel.setVisibility(View.VISIBLE); /** Display the profile information based off the ID */ controller.displayInbox(thisFragment); return rootView; } public void hideProgressSpinner() { this.inboxProgressWheel.setVisibility(View.GONE); } public ViewPager getInboxViewPager() { return this.inboxViewPager; } public TabLayout getInboxTabLayout() { return this.inboxTabLayout; } }

Su archivo de diseño

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:wheel="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.design.widget.TabLayout android:id="@+id/inboxTabs" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabMode="scrollable" /> <com.pnikosis.materialishprogress.ProgressWheel android:id="@+id/inbox_progress_wheel" android:layout_width="80dp" android:layout_height="80dp" android:layout_gravity="center" wheel:matProg_barColor="#5588FF" wheel:matProg_progressIndeterminate="true" android:visibility="gone"/> <android.support.v4.view.ViewPager android:id="@+id/inboxViewPager" android:layout_width="match_parent" android:layout_height="0px" android:layout_weight="1" android:background="@android:color/white" /> </LinearLayout>

Fragmento de pestaña y su archivo de inflación

<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout android:id="@+id/main_content" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <com.baoyz.widget.PullRefreshLayout android:id="@+id/tabPullRefresh" android:layout_width="match_parent" android:layout_height="match_parent"> <view android:id="@+id/tabRecyclerHolder" class="android.support.v7.widget.RecyclerView" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="8dp" android:paddingBottom="8dp" android:clipToPadding="false" android:layout_centerInParent="true"/> </com.baoyz.widget.PullRefreshLayout> <com.melnykov.fab.FloatingActionButton android:id="@+id/tabFab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|right" android:layout_margin="16dp" android:src="@mipmap/ic_add_white"/> </android.support.design.widget.CoordinatorLayout> public class TabRecyclerHolder extends Fragment { @Bind(R.id.tabRecyclerHolder) RecyclerView tabRecyclerHolder; @Bind(R.id.tabPullRefresh) PullRefreshLayout tabPullRefresh; @Bind(R.id.tabFab) FloatingActionButton recyclerFab; private String tabTitle = "Title"; public TabRecyclerHolder(){} @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.tab_recycler_holder, container, false); ButterKnife.bind(this, rootView); recyclerFab.hide(false); tabPullRefresh.setRefreshStyle(PullRefreshLayout.STYLE_MATERIAL); return rootView; } public RecyclerView getTabRecyclerHolder() { return this.tabRecyclerHolder; } public FloatingActionButton getRecyclerFab() { return this.recyclerFab; } public String getTabTitle() { return this.tabTitle; } public void setTabTitle(String title) { this.tabTitle = title; } public PullRefreshLayout getTabPullRefresh() { return this.tabPullRefresh; } }

Mi adaptador de pestañas

public class TabPagerAdapter extends FragmentStatePagerAdapter { private CGController controller; private List<Object> items; public TabPagerAdapter(FragmentManager fm, CGController controller, List<Object> items) { super(fm); this.controller = controller; this.items = items; } @Override public int getCount() { return items.size(); } @Override public Fragment getItem(int num) { return (TabRecyclerHolder)items.get(num); } @Override public String getPageTitle(int num){ return ((TabRecyclerHolder)items.get(num)).getTabTitle(); } }

El código de procesamiento

public void viewInbox() { /** Set up the views */ receivedHolder = new TabRecyclerHolder(); receivedHolder.setTabTitle(Constants.TAB_INBOX_RECEIVED); sentHolder = new TabRecyclerHolder(); sentHolder.setTabTitle(Constants.TAB_INBOX_SENT); tabs.add(receivedHolder); tabs.add(sentHolder); /** Set up the tabs */ final ViewPager inboxViewPager = inboxFragment.getInboxViewPager(); TabLayout inboxTabLayout = inboxFragment.getInboxTabLayout(); /** Set the adapter for the view pager */ inboxViewPager.setAdapter(new TabPagerAdapter(inboxFragment.getChildFragmentManager(), controller, tabs)); /** set up the tab look and feel */ inboxTabLayout.setTabGravity(TabLayout.GRAVITY_FILL); inboxTabLayout.setTabMode(TabLayout.MODE_FIXED); inboxViewPager.setOffscreenPageLimit(3); inboxViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(inboxTabLayout)); inboxTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { inboxViewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override public void onTabReselected(TabLayout.Tab tab) { } }); /** And, display! */ inboxTabLayout.setupWithViewPager(inboxViewPager); receivedAdapter = new RecyclerListAdapter(controller, items); final RecyclerView receivedList = receivedHolder.getTabRecyclerHolder(); receivedList.setLayoutManager(new LinearLayoutManager(controller.getContext())); receivedList.setAdapter(receivedAdapter); }

Hay algún código que me he perdido, pero no es pertinente a la pregunta. El código funciona perfectamente cuando inicialmente se ve el fragmento. Sin embargo, dado que mi aplicación contiene una sola actividad y solo reemplaza una vista de contenido para cada fragmento al que se navega, cada fragmento se agrega a la pila posterior y luego aparece cuando se presiona el botón Atrás. Mi problema es que al navegar de regreso a este fragmento, la vista dentro de la pestaña no se está inflando, lo que significa que no se puede acceder a ningún elemento (y, por lo tanto, la aplicación falla al intentar mostrar los datos en la vista del reciclador, etc.).

He echado un vistazo a esta pregunta: TabLayout ViewPager no se carga cuando uso Backstack e implementé su sugerencia (usando getChildFragmentManager() al configurar el adaptador de pager) sin embargo eso no ha solucionado mi problema.

¡Ayuda sería apreciada!