Android: Titel ändern in der ActionBar aus Navigations Schublade
Erstellte ich eine app mit Navigation Drawer
im BaseActivity
. Alles funktioniert ok, außer die änderung des Titels in der Action Bar
. der Titel ändert sich dann, für eine Sekunde, aber beim öffnen der neuen Tätigkeit gezeigt wird der original-Titel.
Was kann der Fehler sein? Dank
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);
}
Ich denke, der Fehler ist die Nutzung der Aktivitäten... aber ich weiß nicht, wie fix
- Vielleicht, weil Sie beim festlegen der ActionBar Titel zweimal: in den
onDrawerClosed
- Methode und die anderen inonDrawerOpened
. So, der Titel wird überschrieben, mit der neuesten.
InformationsquelleAutor Charlie | 2014-03-25
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Android Studio ermöglicht das hinzufügen einer navigation drawer, um die app durch Datei | Neu | Aktivität. Dieses "ready-made" navigation drawer kommt mit alles was Sie brauchen: Eigenschaften, Methoden, Ereignisse, etc.
Nächsten Schritte zum ändern von Titeln für die verschiedenen Fragmente sind gedacht, um mit dem ready-made-navigation-drawer von Android Studio, aber Sie könnte hilfreich sein, anyothers:
Den navigation-drawer hat mehrere Dateien : eine Aktivität, und eine oder
weitere Fragmente. Öffnen Sie die java-Aktivität-Datei für Ihr Navigations-Schublade (was
Sie rufen "Base Activity").
Find-Methode onCreate.
In dieser Methode fügen Sie die Zeile mTitle = "???", wo "???" ist der Titel von
das erste fragment, das wird mir angezeigt werden, sobald die navigation Schublade
- Bildschirm wird angezeigt.
Finden Sie nun die Methode onNavigationDrawerItemSelected. CHARLIE, ich bin mir nicht sicher,
aber ich glaube, Sie haben es unter dem Namen opcionesPanelLateral.
In dieser Methode haben Sie eine Schalter. Mit diesem Schalter öffnet sich das entsprechende
fragment abhängig von der gewählten option. Zu set die Titel der einzelnen
fragment, gehen Sie zu jedem Fall in den Schalter ein hinzufügen der Zeile mTitle = "Meine
title"; vor BRD = new my_frag();. Auf diese Weise, wenn das fragment öffnet
es wird sich zeigen, auch den passenden Titel.
Find-Methode restoreActionBar. CHARLIE, ich sehe es nicht in deinem code
noch einer äquivalenten Methode. Fügen Sie es hinzu. In der es, fügen Sie die Zeile
actionBar.setTitle( mTitle);, und hier ist, wo der Titel eigentlich
Satz (vielleicht das ist, warum Sie Ihren Titel verschwindet). Rufen Sie diese Methode innerhalb
onCreateOptionsMenu (nach aufblasen).
Das ist es. Ich bin mit hart-codierten strings, wenn Sie nach Android-Regeln verwenden strings.xml.
Nun ein Beispiel aus der Praxis aus und die app, die ich jetzt arbeite. Weiter ist die raw-code von meinem "BaseActivity" der ready-made-navigation Schublade (einige Dinge sind in Spanisch, weil ich bin costarrican):
private CharSequence mTitle;
.