2014-03-25 5 views
6

Ich habe eine App mit Navigation Drawer in BaseActivity erstellt. Alles funktioniert gut außer der Änderung des Titels in Action Bar. Der Titel ändert sich für eine Sekunde, aber beim Öffnen der neuen Aktivität wird der Originaltitel angezeigt.Android: Titel in ActionBar von Navigation Drawer ändern

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); 
} 

denke ich, dass Fehler der Verwendung ist die Aktivitäten ... aber ich weiß nicht, wie zu beheben

+0

Vielleicht, weil Sie zweimal ActionBar Titel sind Einstellung: Ein in der ' onDrawerClosed' Methode und die andere in 'onDrawerOpened'. So wird der Titel mit dem neuesten überschrieben. – ChuongPham

Antwort

1

Android Studio ermöglicht eine Navigationsleiste auf die App hinzufügen durch Datei | Neu | Aktivität. Diese "fertige" Navigationsschublade wird mit allem geliefert, was Sie brauchen: Eigenschaften, Methoden, Ereignisse, etc.

Die nächsten Schritte zum Ändern der Titel für verschiedene Fragmente sind für die Verwendung mit der vorgefertigten Navigationsschublade von Android Studio gedacht, aber sie könnten zu anyothers nützlich sein:

  1. Die Navigationsleiste verfügt über mehrere Dateien: eine Aktivität und ein oder mehr Fragmente. Öffnen Sie die Java-Aktivitätsdatei Ihrer Navigationsleiste (was Sie "Base Activity" nennen).

  2. Methode onCreate suchen.

  3. Fügen Sie in dieser Methode die Zeile mTitle = "???", wo "???" ist der Titel das erste Fragment, das mir angezeigt wird, sobald die Navigationsleiste Bildschirm erscheint.

  4. Jetzt finden Sie die Methode onNavigationDrawerItemSelected. CHARLIE, ich bin mir nicht sicher, aber ich glaube, Sie haben es unter dem Namen opcionesPanelLateral.

  5. Bei dieser Methode haben Sie einen Schalter. Dieser Schalter öffnet das entsprechende Fragment abhängig von der ausgewählten Option. Um Set der Titel für jeden Fragment, gehen Sie zu jedem Fall im Schalter und fügen Sie die Zeile mTitle = "My Titel"; vor frg = new my_frag();. Auf diese Weise, wenn das Fragment öffnet, zeigt es den passenden Titel an.

  6. Methode suchen restoreActionBar. CHARLIE, ich sehe es weder in deinem Code noch in einer gleichwertigen Methode. Fügen Sie es hinzu. Fügen Sie darin die Zeile actionBar.setTitle (mTitle);, und hier ist, wo der Titel tatsächlich gesetzt ist (vielleicht ist deshalb der Titel verschwindet). Rufen Sie diese Methode innerhalb onCreateOptionsMenu (nach dem Aufblasen).

Das ist es. Ich verwende fest codierte Zeichenfolgen. Wenn Sie Android-Regeln folgen, verwenden Sie strings.xml.

Jetzt ein reales Beispiel von und app arbeite ich gerade jetzt. Als nächstes wird der Roh-Code meiner „BaseActivity“ ist der fertige Navigationsleiste (einige Dinge sind in Spanisch, weil ich costarrican bin):

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)); 
} 
//============================================================================== 
} 
//------------------------------------------------------------------------------ 
} 
+0

was ist mTitle selbst? Ist es ein String? weil es rote Linie zeigt. –

+0

@ImranAslam, "mTitle" wird am Anfang meines Codes deklariert (unter "public class menu_act"): 'private CharSequence mTitle;'. –