Android:从导航抽屉中更改ActionBar中的标题

时间:2014-03-25 09:07:18

标签: android android-actionbar title navigation-drawer

我在Navigation Drawer中创建了一个BaseActivity的应用。除Action Bar中的标题更改外,一切正常。标题会更改一秒钟,但在打开新活动时会显示原始标题。

错误是什么?感谢

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

我认为错误是使用活动...但我不知道修复

1 个答案:

答案 0 :(得分:1)

Android Studio允许通过文件|向应用添加导航抽屉新的|活性即可。这是&#34;现成的&#34;导航抽屉带有您需要的一切:属性,方法,事件等。

更改不同片段的标题的后续步骤旨在与Android Studio的现成导航抽屉一起使用,但它们可能对任何人都有帮助:

  1. 导航抽屉有几个文件:一个活动,一个或 更多碎片。打开导航抽屉的java活动文件(什么 你打电话给#34;基本活动&#34;)。

  2. 查找方法 onCreate

  3. 在此方法中,添加 mTitle =&#34; ???&#34; 这一行,其中&#34; ???&#34;是的标题 我将在导航抽屉中显示的第一个片段 屏幕出现。

  4. 现在找到方法 onNavigationDrawerItemSelected 。查理,我不确定, 但我相信你的名字是 opcionesPanelLateral

  5. 在此方法中,您有开关。此开关打开适当的 片段取决于所选的选项。要设置每个标题 片段,转到开关中的每个大小写添加行 mTitle =&#34; My 标题&#34 ;; frg = new my_frag(); 之前。这样,片段打开时 它会显示合适的标题。

  6. 查找方法 restoreActionBar 。查理,我在你的代码中没有看到它 也没有任何等效方法。添加它。在里面,添加线 actionBar.setTitle(mTitle); ,这里标题实际上是 设置(也许这就是你的标题消失的原因)。在里面调用这个方法 onCreateOptionsMenu (充气后)。

  7. 那就是它。我使用硬编码字符串,如果您遵循Android规则,请使用strings.xml。

    现在是一个真实的例子来自我现在正在努力的应用程序。接下来是我的&#34; BaseActivity&#34;的原始代码。现成的导航抽屉(有些东西是西班牙语,因为我是成年人):

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