Android: cambia el título en ActionBar desde el Gaveta de navegación
He creado una aplicación con el Navigation Drawer
en BaseActivity
. Todo funciona bien, excepto el cambio de título en la Action Bar
. El título cambia por un segundo pero al abrir la nueva actividad se muestra el título original.
¿Cuál puede ser el error? Gracias
- Cómo cambiar el color de la barra de título sin tema
- Android: centra el título de la barra de herramientas
- Cambio de la barra de título de Android de fondo
- La barra de título sigue apareciendo, incluso con requestWindowFeature o android: theme
- Android: ¿Cómo establecer un contexto generadoMenú título?
BaseActivity
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); PerfilAdapter.iniciarBaseDatos(this); perfilObj = PerfilAdapter.selectPerfil(1); requestWindowFeature(Window.FEATURE_ACTION_BAR); cargarActionBar(); cargarDrawerLayout(savedInstanceState); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (mDrawerToggle.onOptionsItemSelected(item)) { return true; } switch (item.getItemId()) { case R.id.menuOpcSonidos: ... return true; case R.id.menuOpcCambiarColor: ... return true; default: return super.onOptionsItemSelected(item); } } @Override public boolean onPrepareOptionsMenu(Menu menu) { menu.findItem(R.id.menuOpcSonidos) .setTitle(getResources().getString(R.string.sonidoOnOff) + " " + perfilObj.getSonidos()); return super.onPrepareOptionsMenu(menu); } private void cargarActionBar() { ActionBar actionBar = getActionBar(); int[] colores2 = Modulo.cargarColoresDrawerlayout(perfilObj.getColor()); actionBar.setBackgroundDrawable(new GradientDrawable(Orientation.BOTTOM_TOP, colores2)); getActionBar().setDisplayHomeAsUpEnabled(true); getActionBar().setHomeButtonEnabled(true); int titleId = Resources.getSystem().getIdentifier("action_bar_title", "id", "android"); TextView textoTitulo = (TextView)findViewById(titleId); textoTitulo.setTextColor(getResources().getColor(R.color.blanco)); textoTitulo.setTypeface(null, Typeface.BOLD); textoTitulo.setTextSize(19); textoTitulo.setShadowLayer(5, 0, 0, getResources().getColor(R.color.negro)); } private void cargarDrawerLayout(Bundle b) { mTitle = mDrawerTitle = getTitle(); textosMenuLateral = getResources().getStringArray(R.array.nav_drawer_items); iconosMenuLateral1 = getResources() .obtainTypedArray(R.array.iconos_menu_lateral1); iconosMenuLateral2 = getResources() .obtainTypedArray(R.array.iconos_menu_lateral2); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); mDrawerList = (ListView) findViewById(R.id.list_slidermenuMain); int[] colores = {0, 0xFFFFFFFF, 0}; mDrawerList.setDivider(new GradientDrawable(Orientation.RIGHT_LEFT, colores)); mDrawerList.setDividerHeight(4); navDrawerItems1 = new ArrayList<DrawerItem>(); navDrawerItems1.add(new DrawerItem(textosMenuLateral[0], iconosMenuLateral1.getResourceId(0, -1))); navDrawerItems1.add(new DrawerItem(textosMenuLateral[1], iconosMenuLateral1.getResourceId(1, -1))); navDrawerItems1.add(new DrawerItem(textosMenuLateral[2], iconosMenuLateral1.getResourceId(2, -1))); navDrawerItems1.add(new DrawerItem(textosMenuLateral[3], iconosMenuLateral1.getResourceId(3, -1))); navDrawerItems1.add(new DrawerItem(textosMenuLateral[4], iconosMenuLateral1.getResourceId(4, -1))); navDrawerItems2 = new ArrayList<DrawerItem>(); navDrawerItems2.add(new DrawerItem(textosMenuLateral[0], iconosMenuLateral2.getResourceId(0, -1))); navDrawerItems2.add(new DrawerItem(textosMenuLateral[1], iconosMenuLateral2.getResourceId(1, -1))); navDrawerItems2.add(new DrawerItem(textosMenuLateral[2], iconosMenuLateral2.getResourceId(2, -1))); navDrawerItems2.add(new DrawerItem(textosMenuLateral[3], iconosMenuLateral2.getResourceId(3, -1))); navDrawerItems2.add(new DrawerItem(textosMenuLateral[4], iconosMenuLateral2.getResourceId(4, -1))); iconosMenuLateral1.recycle(); iconosMenuLateral2.recycle(); mDrawerList.setOnItemClickListener(new SlideMenuClickListener()); adapter = new DrawerListAdapter(getApplicationContext(), navDrawerItems1, navDrawerItems2, perfilObj.getColor(), pos); mDrawerList.setAdapter(adapter); mDrawerToggle = new ActionBarDrawerToggle( this, mDrawerLayout, R.drawable.icono_drawer, R.string.app_name, R.string.app_name ) { public void onDrawerClosed(View view) { getActionBar().setTitle(mTitle); invalidateOptionsMenu(); } public void onDrawerOpened(View drawerView) { getActionBar().setTitle(mDrawerTitle); invalidateOptionsMenu(); } }; mDrawerLayout.setDrawerListener(mDrawerToggle); if (b == null) { opcionesPanelLateral(0); } } private class SlideMenuClickListener implements ListView.OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { TextView textView = (TextView) view.findViewById(R.id.title); textView.setTypeface(null, Typeface.BOLD); opcionesPanelLateral(position); } } private void opcionesPanelLateral(int position) { Intent i; switch (position) { case 0: pos = 0; break; case 1: i = new Intent(this, ActivitySecond.class); mDrawerLayout.closeDrawer(mDrawerList); startActivity(i); pos = 1; break; case 2: i = new Intent(this, ActivityThird.class); mDrawerLayout.closeDrawer(mDrawerList); startActivity(i); pos = 2; break; case 3: i = new Intent(this, ActivityFourth.class); mDrawerLayout.closeDrawer(mDrawerList); startActivity(i); pos = 3; break; case 4: break; default: break; } mDrawerList.setItemChecked(pos, true); mDrawerList.setSelection(pos); setTitle(textosMenuLateral[pos]); mDrawerLayout.closeDrawer(mDrawerList); } @Override public void setTitle(CharSequence title) { mTitle = title; getActionBar().setTitle(mTitle); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); cargarActionBar(); cargarDrawerLayout(savedInstanceState); mDrawerToggle.syncState(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mDrawerToggle.onConfigurationChanged(newConfig); } public void onBackPressed() { mDrawerLayout.closeDrawer(mDrawerList); }
Creo que el error es el uso de las Actividades … pero no lo sé como solución
- Altura establecida para Android de la barra de título personalizada
- Cómo crear un ActionBar personalizado con el cajón de navegación
- Título de la acción: Mostrar Título AND Icon
- Cómo alinear el título en el centro de ActionBar en el tema predeterminado (Theme.Holo.Light)
- Calcule el rumbo de la brújula / rumbo a la ubicación en Android
- Cómo ocultar la barra de título desde el principio
- Cómo mostrar el título de la barra de acciones de Android sin que se produzca el truncamiento
- Barra de título de Android dejando espacio cuando se reanuda la aplicación
Android Studio permite agregar un cajón de navegación a la aplicación a través de Archivo | Nuevo | Actividad . Este cajón de navegación "ready-made" viene con todo lo que necesita: propiedades, métodos, eventos, etc.
Los siguientes pasos para cambiar los títulos de los diferentes fragmentos están diseñados para usarlos con el cajón de navegación de Android Studio, pero pueden ser útiles para cualquier otro:
-
El cajón de navegación tiene varios archivos: una actividad y uno o más fragmentos. Abra el archivo de actividad java de su cajón de navegación (lo que usted llama "Actividad básica").
-
Encontrar el método onCreate .
-
En este método, agregue la línea mTitle = "???" , dónde "???" Es el título del primer fragmento que me mostrará tan pronto como aparezca la pantalla del cajón de navegación.
-
Ahora encuentre el método onNavigationDrawerItemSelected . CHARLIE, no estoy seguro, pero creo que lo tienes bajo el nombre de opcionesPanelLateral .
-
En este método usted tiene un interruptor . Este interruptor abre el fragmento apropiado dependiendo de la opción seleccionada. Para establecer el título de cada fragmento, vaya a cada caso en el conmutador y agregue la línea mTitle = "Mi título"; Antes de frg = new my_frag (); . De esta manera, cuando el fragmento se abre, mostrará el título apropiado.
-
Método de búsqueda restoreActionBar . CHARLIE, no lo veo en tu código ni en ningún otro método equivalente. Añadirlo. Dentro de ella, agregue la línea actionBar.setTitle (mTitle); , Y aquí es donde el título está realmente establecido (tal vez por eso desaparece su título). Llame a este método dentro de OnCreateOptionsMenu (después de inflar).
Eso es. Estoy usando cadenas codificadas, si sigue las reglas de Android, use strings.xml.
Ahora un ejemplo de vida real y la aplicación en la que estoy trabajando ahora mismo. A continuación está el código en bruto de mi "BaseActivity" del cajón de navegación ya hecho (algunas cosas están en español porque soy costarricano):
package my_package; //------------------------------------------------------------------------------ import android.app.Activity; import android.graphics.drawable.ColorDrawable; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBar; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.support.v4.widget.DrawerLayout; //------------------------------------------------------------------------------ public class menu_act extends ActionBarActivity implements drawer_frg.NavigationDrawerCallbacks { //------------------------------------------------------------------------------ // Fragment managing the behaviors, interactions and presentation of the navigation drawer. private drawer_frg mNavigationDrawerFragment; // Used to store the last screen title. For use in {@link #restoreActionBar()}. private CharSequence mTitle; //------------------------------------------------------------------------------ @Override protected void onCreate ( Bundle savedInstanceState ) { super.onCreate( savedInstanceState ); setContentView( R.layout.menu_lay ); mNavigationDrawerFragment = (drawer_frg) getSupportFragmentManager().findFragmentById( R.id.navigation_drawer ); mTitle = "Perfil"; // getTitle(); // Set up the drawer. mNavigationDrawerFragment.setUp( R.id.navigation_drawer,( DrawerLayout ) findViewById( R.id.drawer_layout ) ); // BARRA DE TÍTULO ANARANJADA. //ActionBar actionBar = getSupportActionBar(); //actionBar.setBackgroundDrawable( new ColorDrawable( getResources().getColor( R.color.col_nar ) ) ); } //------------------------------------------------------------------------------ @Override public void onNavigationDrawerItemSelected ( int position ) { Fragment frg; // getSupportActionBar().setDisplayOptions( ActionBar.DISPLAY_SHOW_CUSTOM ); switch ( position ) { case 0 : //getSupportActionBar().setCustomView( R.layout.perfil_tit ); mTitle = "Perfil"; frg = new perfil_frg(); break; case 1 : // getSupportActionBar().setCustomView( R.layout.contactos_tit ); mTitle = "Contactos"; frg = new contactos_frg(); break; default : frg = PlaceholderFragment.newInstance( position + 1 ); } FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction().replace( R.id.container,frg ).commit(); } //------------------------------------------------------------------------------ public void onSectionAttached ( int number ) { switch (number) { case 1 : mTitle = getString( R.string.mnu_opc_per ); break; case 2 : mTitle = getString( R.string.mnu_opc_con ); break; case 3 : mTitle = getString( R.string.mnu_opc_sal ); break; } } //------------------------------------------------------------------------------ public void restoreActionBar () { ActionBar actionBar = getSupportActionBar(); actionBar.setNavigationMode( ActionBar.NAVIGATION_MODE_STANDARD ); actionBar.setDisplayShowTitleEnabled( true ); actionBar.setTitle( mTitle ); } //------------------------------------------------------------------------------ @Override public boolean onCreateOptionsMenu(Menu menu) { if ( ! mNavigationDrawerFragment.isDrawerOpen() ) { // Only show items in the action bar relevant to this screen // if the drawer is not showing. Otherwise, let the drawer // decide what to show in the action bar. getMenuInflater().inflate( R.menu.menu_act,menu ); restoreActionBar(); return true; } return super.onCreateOptionsMenu( menu ); } //------------------------------------------------------------------------------ @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); /* //noinspection SimplifiableIfStatement if ( id == R.id.action_settings ) return true; */ //mDrawerToggle.syncState(); return super.onOptionsItemSelected( item ); } //============================================================================== // A placeholder fragment containing a simple view. public static class PlaceholderFragment extends Fragment { //------------------------------------------------------------------------------ // The fragment argument representing the section number for this fragment. private static final String ARG_SECTION_NUMBER = "section_number"; //------------------------------------------------------------------------------ // Returns a new instance of this fragment for the given section number. public static PlaceholderFragment newInstance(int sectionNumber) { PlaceholderFragment fragment = new PlaceholderFragment(); Bundle args = new Bundle(); args.putInt(ARG_SECTION_NUMBER, sectionNumber); fragment.setArguments(args); return fragment; } //------------------------------------------------------------------------------ public PlaceholderFragment() { } //------------------------------------------------------------------------------ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.menu_frg, container, false); return rootView; } //------------------------------------------------------------------------------ @Override public void onAttach(Activity activity) { super.onAttach(activity); ((menu_act) activity).onSectionAttached( getArguments().getInt(ARG_SECTION_NUMBER)); } //============================================================================== } //------------------------------------------------------------------------------ }
- Aplicación de reproductor de youtube para Android, reproducción de Google rechazada para jugar en segundo plano
- Tesseract v3.03 hacer PDF con texto de búsqueda de ejemplo