Contenido de la pestaña usando el estilo de la pestaña actionbarsherlock
Refiriéndose a este código a continuación (tomado de https://gist.github.com/1126843 ) ¿cómo puedo establecer el contenido de las pestañas?
public class NativeTabActivity extends Activity { private TabHost mTabHost; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mTabHost = (TabHost)findViewById(android.R.id.tabhost); mTabHost.setup(); addTab(new TextView(this), "Tab 1"); addTab(new TextView(this), "Tab 2"); addTab(new TextView(this), "Tab 3"); } private void addTab(final View content, final String title) { View tabView = LayoutInflater.from(this).inflate(R.layout.abs__action_bar_tab_layout, null); TextView tv = (TextView) tabView.findViewById(R.id.abs__tab); tv.setText(title); TabSpec setContent = mTabHost.newTabSpec(title).setIndicator(tabView).setContent(new TabContentFactory() { public View createTabContent(String tag) { return content; } }); mTabHost.addTab(setContent); } }
Desde el código, parece que tengo que poner el contenido bajo la vista createTabContent (String tag), pero ¿cómo lo hago?
- Biblioteca resolver a una ruta sin archivo project.properties
- Excepción de puntero nulo mostrando en la barra de acción sherlock library
- AutoCompleteTextView no muestra correctamente el texto con el tema ActionBarSherlock
- Desactivar programaticamente android: windowActionBarOverlay estilo de barra de acción
- Archivos de solicitud de clase no empacados en APK
- ActionbarSherlock no incluye la sección "desbordamiento" de la barra de acciones (en Android 2.1)
- Cómo establecer el color del título en ActionBarSherlock?
- EditText perder el foco con el teclado duro cuando TabHost está presente en la actividad
- ActionBarSherlock - fondo personalizado de la barra de acción con divisor
- Estilo sherlock ActionMode fondo
- Usar una vista personalizada para elementos de menú de desbordamiento
- Error después de agregar dependencias a la barra de acción Sherlock en Android Studio 0.5.8
- Android Studio Pre Dexing falla
Utilizo Fragmentos para mi implementación de Sherlock.
public class ActionBarTabs extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActionBar bar = getSupportActionBar(); bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); bar.addTab(bar.newTab() .setText("Home") .setTabListener(new TabListener<DashBoardFragment>( this, "home", DashBoardFragment.class, null))); bar.addTab(bar.newTab() .setText("Inventory") .setTabListener(new TabListener<InventoryFragment>( this, "inventory", InventoryFragment.class, null))); if (savedInstanceState != null) { bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0)); } } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: // app icon in action bar clicked; go Location selection Intent intent = new Intent(ActionBarTabs.this, LocationSelectorActivity.class); ActionBarTabs.this.startActivityForResult(intent,0); return true; default: return super.onOptionsItemSelected(item); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("tab", getSupportActionBar().getSelectedNavigationIndex()); } public class TabListener<T extends Fragment> implements ActionBar.TabListener { private final FragmentActivity mActivity; private final String mTag; private final Class<T> mClass; private final Bundle mArgs; private Fragment mFragment; public TabListener(FragmentActivity activity, String tag, Class<T> clz, Bundle args) { mActivity = activity; mTag = tag; mClass = clz; mArgs = args; FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction(); // Check to see if we already have a fragment for this tab, probably // from a previously saved state. If so, deactivate it, because our // initial state is that a tab isn't shown. mFragment = mActivity.getSupportFragmentManager().findFragmentByTag(mTag); if (mFragment != null && !mFragment.isDetached()) { ft.detach(mFragment); } } @Override public void onTabSelected(Tab tab) { FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction(); if (mFragment == null) { mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs); ft.add(android.R.id.content, mFragment, mTag); ft.commit(); } else { ft.attach(mFragment); ft.commit(); } } @Override public void onTabUnselected(Tab tab) { FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction(); if (mFragment != null) { ft.detach(mFragment); ft.commitAllowingStateLoss(); } } @Override public void onTabReselected(Tab tab) { } } }
El cambio clave para cargar fragmentos diferentes en las pestañas es simplemente cambiar "YOUR_FRAGMENT_NAME" al nombre de la clase de fragmento en estas líneas:
bar.addTab(bar.newTab() .setText("Home") .setTabListener(new TabListener<YOUR_FRAGMENT_NAME>( this, "home", YOUR_FRAGMENT_NAME.class, null)));
¡Espero que esto ayude!
He encontrado la respuesta de Rymnel muy útil, pero tuve que hacer algunos cambios para que funcione correctamente con ActionBarSherlock 4.0. Yo estaba teniendo problemas con la sustitución de los métodos onTab pasando en FragmentTransactions, por lo que sólo utiliza los métodos predeterminados y reasignado el "ft" var dentro del método. Estoy seguro de que hay una manera más limpia de hacer esto, pero aquí está mi código de trabajo:
public class TabTestActivity extends SherlockFragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActionBar bar = getSupportActionBar(); bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); bar.setDisplayHomeAsUpEnabled(true); bar.setDisplayShowTitleEnabled(true); bar.setTitle("Activity Title"); bar.addTab(bar .newTab() .setText("Tab 1") .setTabListener( new TabListener<TabTest1>(this, "tab1", TabTest1.class, null))); bar.addTab(bar .newTab() .setText("Tab 2") .setTabListener( new TabListener<TabTest2>(this, "tab2", TabTest2.class, null))); bar.addTab(bar .newTab() .setText("Tab 3") .setTabListener(new TabListener<TabTest3>(this, "tab3", TabTest3.class, null))); if (savedInstanceState != null) { bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0)); } } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: // app icon in action bar clicked; go home Intent intent = new Intent(this, DashboardActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); return true; default: return super.onOptionsItemSelected(item); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("tab", getSupportActionBar() .getSelectedNavigationIndex()); } public class TabListener<T extends Fragment> implements ActionBar.TabListener { private final FragmentActivity mActivity; private final String mTag; private final Class<T> mClass; private final Bundle mArgs; private Fragment mFragment; public TabListener(FragmentActivity activity, String tag, Class<T> clz, Bundle args) { mActivity = activity; mTag = tag; mClass = clz; mArgs = args; FragmentTransaction ft = mActivity.getSupportFragmentManager() .beginTransaction(); // Check to see if we already have a fragment for this tab, probably // from a previously saved state. If so, deactivate it, because our // initial state is that a tab isn't shown. mFragment = mActivity.getSupportFragmentManager() .findFragmentByTag(mTag); if (mFragment != null && !mFragment.isDetached()) { ft.detach(mFragment); } } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { ft = mActivity.getSupportFragmentManager() .beginTransaction(); if (mFragment == null) { mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs); ft.add(android.R.id.content, mFragment, mTag); ft.commit(); } else { ft.attach(mFragment); ft.commit(); } } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { ft = mActivity.getSupportFragmentManager() .beginTransaction(); if (mFragment != null) { ft.detach(mFragment); ft.commitAllowingStateLoss(); } } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { } }
- ¿Cómo puedo convertir String a Drawable
- Android: ¿por qué se detuvo la notificación de alarma después de reiniciar el sistema