2014-03-25 48 views
6

我創建了一個應用程序Navigation DrawerBaseActivity。除Action Bar中的標題更改外,一切都正常。標題會改變一秒,但是當打開新活動時會顯示原始標題。Android:在導航抽屜中更改標題在ActionBar

什麼是錯誤?感謝

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

我認爲錯誤是使用了活動......但我不知道作爲解決

+0

也許是因爲你設置ActionBar的標題兩次:一是在' onDrawerClosed'方法,另一個在'onDrawerOpened'中。所以,標題將被最新的內容覆蓋。 – ChuongPham

回答

1

的Android Studio允許以抽屜式導航添加到應用程序通過文件|新增|活動。這個「現成的」抽屜帶有您需要的一切:屬性,方法,事件等。

爲了改變不同片段的標題,下面的步驟是用於Android Studio的現成導航抽屜,但他們可能是有益的anyothers:

  1. 導航抽屜有幾個文件:一個活動,和一個或更多 片段。打開導航抽屜的java活動文件(你稱之爲「Base Activity」的 )。

  2. 查找方法onCreate

  3. 在此方法中,添加行mTitle =「???」,其中「???」是 的標題,第一個片段將在導航抽屜 屏幕出現後立即顯示。

  4. 現在找到方法onNavigationDrawerItemSelected。 CHARLIE,我不確定, 但我相信你的名字是opcionesPanelLateral

  5. 在這種方法中你有一個開關。此開關根據所選選項打開相應的 片段。到設置標題爲每個 片段,轉到每個的情況下在交換機中添加一行mTitle =「我的 標題」;之前frg = new my_frag();。這樣,當片段打開 它將顯示適當的標題。

  6. 查找方法restoreActionBar。查理,我沒有看到它在你的代碼 或任何等效的方法。添加它。在裏面,添加行 actionBar.setTitle(mTitle);,這裏的標題實際上是 設置(也許這就是爲什麼你的標題消失)。在 onCreateOptionsMenu(在膨脹後)調用此方法。

就是這樣。我使用硬編碼的字符串,如果遵循Android規則,請使用strings.xml。

現在我正在處理一個現實生活中的應用程序和應用程序。接下來是我的現成的導航抽屜「BaseActivity」的原始代碼(有些事情是在西班牙,因爲我costarrican):

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

什麼是mTitle本身?是字符串嗎?因爲它顯示紅線。 –

+0

@ImranAslam,「mTitle」在我的代碼的頂部(在「public class menu_act」下面)聲明:'private CharSequence mTitle;'。 –