Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


(ActionBar) Tabs + Pager + detail Fragmentos dentro del contenedor ViewPager

Para ActionBarSherlock me gustaría tener (Acción Bar) Tabs + Pager. Yo uso Fragmentos dentro de ese contenedor de buscapersonas. Ya tengo los ejemplos de http://actionbarsherlock.com/ trabajando, pero no puedo conseguir conseguir un fragmento de los detalles dentro de ese contenedor del paginador cuando chascaría encendido digamos un listitem en el primer fragmento.

¿Es imposible tener algo como esto:

  • ¿Cómo codificar una nueva función compatible con versiones anteriores en Android SDK?
  • Cómo agregar el menú de opciones de barra de acciones en Fragmentos de Android
  • ¿Cómo ocultar el icono de acción compartida (que utiliza más) cerca del proveedor de acciones compartidas?
  • ¿Cómo usar el tema Holo.Light, pero tiene el uso de ActionBar Holo withouth ICS?
  • Centro Alinee el título en la barra de acción utilizando estilos en android.
  • ¿Cómo detener la barra de navegación de ActionBar para mostrar como un hilandero cuando llega demasiado tiempo?
  • Actividad con pestañas y contenedor de buscapersonas

    • Fragmento Un contenedor dentro de buscapersonas en Tab1
      • Haga clic en algo en el fragmento A y muestre el fragmento B en el mismo contenedor de buscapersonas en Tab1.

    El fragmento A no es visible, sólo el fragmento B es visible, pero también todas las pestañas.

    Por el momento creo que sólo se puede iniciar una nueva actividad (que llevaría a cabo el Fragmento B dentro de ella) después de hacer clic en algo en el fragmento A.

  • Cómo agregar elementos de submenú a ActionBar acción en código?
  • Spinner de ancho completo en ActionBar
  • Mantenga la barra de acciones visualizada al cambiar PreferenceScreen
  • Dropdown Spinner fuera de la barra de acción? (IceCream Sandwich estilo, con ActionBarSherlock)
  • Android alinea los elementos del menú a la izquierda en la barra de acción
  • Implementación de las pestañas ActionBar con v4 Fragments API
  • 4 Solutions collect form web for “(ActionBar) Tabs + Pager + detail Fragmentos dentro del contenedor ViewPager”

    Aquí está mi solución para el (Tabs + Fragment + ViewPager) que funciona para mí como yo quería, espero que funcione para usted también

    Aquí está el archivo xml

      <LinearLayout android:id="@+id/linearLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="0dip" android:layout_height="match_parent" android:layout_weight="5" /> <FrameLayout android:id="@+id/fragment_details" android:layout_width="0px" android:layout_height="match_parent" android:layout_weight="4.3" /> </LinearLayout> 

    Aquí está el código para MainActivity.java Voy a publicar el código pertinente sólo para que tenga que administrarlo

     public class MainActivity extends FragmentActivity implements DialogInterface.OnDismissListener, TabDataResponder { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); artistTab = getSupportActionBar().newTab().setText( R.string.tab_name_artist); albumTab = getSupportActionBar().newTab().setText( R.string.tab_name_album); songTab = getSupportActionBar().newTab().setText( R.string.tab_name_songs); map = new HashMap<String, Integer>(); mViewPager = (ViewPager) findViewById(R.id.pager); FrameLayout deatil = (FrameLayout) findViewById(R.id.fragment_details); mDualPane = (deatil != null) && (deatil.getVisibility() == View.VISIBLE); mTabsAdapter = new TabsAdapter(this, getSupportActionBar(), mViewPager); if (savedInstanceState != null) { flag = true; index = savedInstanceState.getInt("index"); } setUpTabView(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("index", getSupportActionBar() .getSelectedNavigationIndex()); } private void setUpTabView() { mTabsAdapter.addTab(artistTab, ArtistFragment.class, null); mTabsAdapter.addTab(albumTab, AlbumFragment.class, null); mTabsAdapter.addTab(songTab, SongFragment.class, null); getSupportActionBar().setSelectedNavigationItem(index); } public static class TabsAdapter extends FragmentPagerAdapter implements ViewPager.OnPageChangeListener, ActionBar.TabListener { private FragmentActivity mContext; private ActionBar mActionBar; private final ViewPager mViewPager; private final ArrayList<String> mTabs = new ArrayList<String>(); private TabDataResponder responder; public TabsAdapter(FragmentActivity activity, ActionBar actionBar, ViewPager pager) { super(activity.getSupportFragmentManager()); mContext = activity; mActionBar = actionBar; mViewPager = pager; // TabDataResponder is an interface which is implemented in MainActivity // You can find implementation @ the last responder = (TabDataResponder) activity; mViewPager.setAdapter(this); mViewPager.setOnPageChangeListener(this); //I have used map to save state of the fragment map.put(SongFragment.TYPE_FRAGMENT.trim(), 0); map.put(AlbumFragment.TYPE_FRAGMENT.trim(), 0); map.put(ArtistFragment.TYPE_FRAGMENT.trim(), 0); } public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) { mTabs.add(clss.getName()); // mArgs.add(args); mActionBar.addTab(tab.setTabListener(this)); notifyDataSetChanged(); } @Override public int getCount() { return mTabs.size(); } @Override public Fragment getItem(int position) { return Fragment .instantiate(mContext, mTabs.get(position), /* * mArgs.get( * position) */null); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { Log.i(TAG, "PageSelected...."); mActionBar.setSelectedNavigationItem(position); } @Override public void onPageScrollStateChanged(int state) { Log.i(TAG, "ScrollSateChanged...."); } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { mViewPager.setCurrentItem(tab.getPosition()); String a = null; if (mDualPane) { a = mTabs.get(tab.getPosition()); responder.loadData(a, map.get(a)); } } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { Log.i(TAG, "Tab is released now...."); } } @Override public void onDismiss(DialogInterface dialog) { setUpTabView(); } //This interface must be call from fragment class //@ the time of event you want to show detail // pass the class name in the type argument using class.getName() method @Override public void loadData(String type, int index) { DetailFragment viewer = (DetailFragment) getSupportFragmentManager() .findFragmentById(R.id.fragment_details); if (mDualPane) { if (viewer == null || viewer.getShownIndex() != index || viewer.getTypeFragment() != type) { DetailFragment df = DetailFragment.newInstance(index, type); getSupportFragmentManager() .beginTransaction() .replace(R.id.fragment_details, df) .setTransition( FragmentTransaction.TRANSIT_FRAGMENT_FADE) .commit(); map.put(type.trim(), index); } } else { Intent intent = new Intent(); intent.setClass(MainActivity.this, DetailActivity.class); intent.putExtra("index", index); intent.putExtra("type", type); startActivity(intent); } } } 

    Y aquí es cómo trato con el fragmento de detalle no muy eficiente, pero tipo de trabajo

     public class DetailFragment extends Fragment{ public static DetailFragment newInstance(int index, String TYPE_FRAGMENT) { DetailFragment f = new DetailFragment(); // Supply index input as an argument. Bundle args = new Bundle(); args.putInt("index", index); args.putString("type", TYPE_FRAGMENT); f.setArguments(args); return f; } public int getShownIndex() { return getArguments().getInt("index", 0); } public String getTypeFragment(){ String a = getArguments().getString("type"); return a; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //template is blank layout View view = inflater.inflate(R.layout.template, container, false); if(getTypeFragment().equals(ArtistFragment.TYPE_FRAGMENT)){ view = null; view = inflater.inflate(R.layout.artist_details, container, false); //.... } else if(getTypeFragment().equals(AlbumFragment.TYPE_FRAGMENT)){ //do's for album fragment } else if(getTypeFragment().equals(SongFragment.TYPE_FRAGMENT)){ //do's for song fragment } return view; } } 

    No guardar el estado de la pestaña en su fragmento individual que va a entrar en conflicto, ya lo estamos haciendo aquí

    EDITAR:
    Animado demasiado pronto. Ahora el details_container no es un viewpager y no puedo usarlo para 'deslizar tabs'.

    ¡Lo encontré! Sólo tenía que definir dos FrameLayouts, con en el primero el ViewPager y en el segundo los fragmentos de detalles se pueden "cargar". Esto se hace agregando fragmentos dinámicamente y reemplazándolos.

    Primero los dos FrameLayouts:

     <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:fadingEdge="none" > <FrameLayout android:id="@+id/main_container" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </FrameLayout> <FrameLayout android:id="@+id/details_container" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout> 

    Luego reemplazar dinámicamente un fragmento:

     // Create new fragment and transaction Fragment detailsFragment = new ExampleFragment(); FragmentTransaction transaction = getFragmentManager().beginTransaction(); // Replace whatever is in the fragment container view with this fragment // and add the transaction to the back stack transaction.replace(R.id.details_container, detailsFragment); transaction.addToBackStack(null); // Commit the transaction transaction.commit(); 

    Muy simple y no entiendo por qué me tomó horas para averiguar esto ..

    Todavía no encontré la posibilidad de tener un contenedor de buscapersonas donde se deben cargar fragmentos y también mantener las pestañas (ActionBar). Sin embargo, he encontrado una solución realmente sucia para lograr esto, con intensidad de inicio (Actividad principal con las pestañas) y terminar las anteriores cuando el backbutton no lo necesita más.

    He adaptado el código de ABS: Support Demos – Tabs y Pager. Pero de nuevo es muy sucio:

    LoaderCursorSupport.CursorLoaderListFragment en Tab2

     @Override public void onListItemClick(ListView l, View v, int position, long id) { Intent intent = new Intent(); intent.setClass(getActivity(), ActionBarTabsPager.class); intent.putExtra("index", position); intent.putExtra("fragment", "details"); intent.putExtra("tab", 1); ActionBarTabsPager.mPreviousActivity = getActivity(); startActivity(intent); 

    ActionBarTabsPager (Actividad principal con pestañas)

     public class ActionBarTabsPager extends FragmentActivity { ViewPager mViewPager; TabsAdapter mTabsAdapter; static Activity mPreviousActivity; static Activity mActivity; static int mTabPosition = -1; static Boolean mTabRefreshed = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.actionbar_tabs_pager); getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); ActionBar.Tab tab1 = getSupportActionBar().newTab().setText("Tab 1"); ActionBar.Tab tab2 = getSupportActionBar().newTab().setText("Tab 2"); ActionBar.Tab tab3 = getSupportActionBar().newTab().setText("Tab 3"); ActionBar.Tab tab4 = getSupportActionBar().newTab().setText("Tab 4"); String fragment = ""; try { Bundle bundle = this.getIntent().getExtras(); fragment = bundle.getString("fragment"); mTabPosition = bundle.getInt("tab"); } catch (Exception ex) { } mViewPager = (ViewPager) findViewById(R.id.pager); mTabsAdapter = new TabsAdapter(this, getSupportActionBar(), mViewPager); mTabsAdapter.addTab(tab1, FragmentStackSupport.CountingFragment.class); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ECLAIR) { mTabsAdapter.addTab(tab2, FragmentStackSupport.CountingFragment.class); mTabsAdapter.addTab(tab3, FragmentStackSupport.CountingFragment.class); mTabsAdapter.addTab(tab4, FragmentStackSupport.CountingFragment.class); } else { if (!fragment.contains("details")) { mTabsAdapter.addTab(tab2, LoaderCursorSupport.CursorLoaderListFragment.class); } else { mTabsAdapter.addTab(tab2, ExampleFragment.class); } mTabsAdapter.addTab(tab3, LoaderCustomSupport.AppListFragment.class); mTabsAdapter.addTab(tab4, LoaderThrottleSupport.ThrottledLoaderListFragment.class); } if (savedInstanceState != null) { getSupportActionBar().setSelectedNavigationItem(savedInstanceState.getInt("index")); } if (mTabPosition > -1) { mTabsAdapter.setPrimaryItem(mTabPosition); mActivity = this; } } 

    Dentro de esta Clase hay un TabsAdapter

     public static class TabsAdapter extends FragmentPagerAdapter implements ViewPager.OnPageChangeListener, ActionBar.TabListener { private final Context mContext; private final ActionBar mActionBar; private final ViewPager mViewPager; private final ArrayList<String> mTabs = new ArrayList<String>(); @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { if (mTabPosition > -1 && mTabRefreshed) { int tabPosition = tab.getPosition(); if (mTabPosition != tabPosition) { if (mPreviousActivity != null) { mPreviousActivity.finish(); mTabRefreshed = false; mPreviousActivity = null; mTabPosition = -1; Intent intent = new Intent(); intent.setClass(mContext, ActionBarTabsPager.class); intent.putExtra("fragment", "home"); intent.putExtra("tab", tabPosition); mActivity.startActivity(intent); mActivity.finish(); } } } mViewPager.setCurrentItem(tab.getPosition()); } 

    ¿Puede esto ser hecho más simple? ¿O debo dejar de tener Tabs junto con la historia de fragmentos? Esto se hizo antes de Android 3.0 con ActivityGroups y Actividades, pero parece que esto no se puede hacer con fragmentos.

    Encontré el otro buen ejemplo de la misma implementación en escuchar … https://github.com/UweTrottmann/SeriesGuide

    En este ejemplo, en el paquete com.battlelancer.seriesguide.ui

    Puede encontrar UpcomingRecentActivity.java y UpcomingFragment.java

    Y diseño upcoming_multipan.xml

    Este ejemplo funciona para mí …

    Tengo un problema al agregar contenido diferente para el detalle-fragmento de las pestañas diferentes, me da clase-cast-excepción

    Por lo que implementó una clase de detalFragment común y creado un diseño independiente en el método onCreateView

    Pero el único problema que encontré es el diseño no está cambiando en la pestaña conmutada, puede ser necesario hacerlo mediante la implementación de algún oyente

    Te diré cuando encontré la respuesta.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.