Cómo mostrar el Cajón de navegación en todas las actividades?

Tengo un Navigation Drawer que debería aparecer en todas mis actividades.

Vi muchas preguntas similares a esta y encontré una solución como Extender la actividad principal con las otras actividades.

Así que amplié mi actividad principal a mi segunda actividad. Pero el cajón no se muestra en la segunda actividad

Actividad principal

 public class MainActivity extends ActionBarActivity { private ListView mDrawerList; private DrawerLayout mDrawer; private CustomActionBarDrawerToggle mDrawerToggle; private String[] menuItems; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR); // getSupportActionBar().hide(); setContentView(R.layout.activity_main_drawer); // enable ActionBar app icon to behave as action to toggle nav drawer getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout); // set a custom shadow that overlays the main content when the drawer // opens mDrawer.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); _initMenu(); mDrawerToggle = new CustomActionBarDrawerToggle(this, mDrawer); mDrawer.setDrawerListener(mDrawerToggle); } private void _initMenu() { NsMenuAdapter mAdapter = new NsMenuAdapter(this); // Add Header mAdapter.addHeader(R.string.ns_menu_main_header); // Add first block menuItems = getResources().getStringArray(R.array.ns_menu_items); String[] menuItemsIcon = getResources().getStringArray(R.array.ns_menu_items_icon); int res = 0; for (String item : menuItems) { int id_title = getResources().getIdentifier(item, "string", this.getPackageName()); int id_icon = getResources().getIdentifier(menuItemsIcon[res], "drawable", this.getPackageName()); NsMenuItemModel mItem = new NsMenuItemModel(id_title, id_icon); // if (res==1) mItem.counter=12; //it is just an example... // if (res==3) mItem.counter=3; //it is just an example... mAdapter.addItem(mItem); res++; } mAdapter.addHeader(R.string.ns_menu_main_header2); mDrawerList = (ListView) findViewById(R.id.drawer); if (mDrawerList != null) mDrawerList.setAdapter(mAdapter); mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // Sync the toggle state after onRestoreInstanceState has occurred. mDrawerToggle.syncState(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mDrawerToggle.onConfigurationChanged(newConfig); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.control_menu, menu); return super.onCreateOptionsMenu(menu); } /* Called whenever we call invalidateOptionsMenu() */ @Override public boolean onPrepareOptionsMenu(Menu menu) { // If the nav drawer is open, hide action items related to the content // view boolean drawerOpen = mDrawer.isDrawerOpen(mDrawerList); menu.findItem(R.id.action_keyboard).setVisible(!drawerOpen); return super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { /* * The action bar home/up should open or close the drawer. * ActionBarDrawerToggle will take care of this. */ if (mDrawerToggle.onOptionsItemSelected(item)) { return true; } // Handle your other action bar items... return super.onOptionsItemSelected(item); } private class CustomActionBarDrawerToggle extends ActionBarDrawerToggle { public CustomActionBarDrawerToggle(Activity mActivity, DrawerLayout mDrawerLayout) { super(mActivity, mDrawerLayout, R.drawable.ic_drawer, R.string.ns_menu_open, R.string.ns_menu_close); } @Override public void onDrawerClosed(View view) { getSupportActionBar().setTitle(getString(R.string.ns_menu_close)); supportInvalidateOptionsMenu(); // creates call to // onPrepareOptionsMenu() } @Override public void onDrawerOpened(View drawerView) { getSupportActionBar().setTitle(getString(R.string.ns_menu_open)); supportInvalidateOptionsMenu(); // creates call to // onPrepareOptionsMenu() } } private class DrawerItemClickListener implements ListView.OnItemClickListener { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { Intent intent = new Intent(MainActivity.this, Tutorial.class); startActivity(intent); } } } 

SecondActivity

  public class Tutorial extends MainActivity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.help); } } 

en onCreate of TutorialActivity no llame a setContentView en setContentView lugar, haga esto:

 @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); LayoutInflater inflater = (LayoutInflater) this .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View contentView = inflater.inflate(R.layout.help, null, false); mDrawer.addView(contentView, 0); } 

hacer que mDrawer MainActivity protegido en MainActivity . y en R.layout.activity_main_drawer simplemente mantenga la etiqueta del cajón y el elemento con gravedad a la izquierda (o derecha).

Aquí está mi implementación … espero que ayude

PRIMERO , este POST es concepto.

SEGUNDO , este es también el CLAVE .

FINALMENTE , aquí está la combinación de todas las respuestas en un solo lugar


ACTIVIDAD BASE

Esta es una actividad base para cualquier otra actividad

Puede ampliar Activity o FragmentActivity o etc. según sus requisitos.

Configuración del Navigation Drawer aquí por una vez.

 public class BaseActivity extends FragmentActivity { protected DrawerLayout mDrawer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.base_layout); mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout); //This is about creating custom listview for navigate drawer //Implementation for NavigateDrawer HERE ! ArrayList drawerListItems = new ArrayList(); drawerListItems.add(new DrawerListItem(0,"AIR° DEVICES")); drawerListItems.add(new DrawerListItem(1,"A/C Device [1]")); drawerListItems.add(new DrawerListItem(1,"A/C Device [2]")); drawerListItems.add(new DrawerListItem(1,"A/C Device [3]")); drawerListItems.add(new DrawerListItem(0,"AIR° FEATURES")); drawerListItems.add(new DrawerListItem(2,"SLEEP MODE")); drawerListItems.add(new DrawerListItem(2,"TRACKING MODE")); drawerListItems.add(new DrawerListItem(2,"SETTINGS")); DrawerAdapter mDrawerAdapter = new DrawerAdapter(this, R.layout.drawer_list_header, drawerListItems); ListView mDrawerList = (ListView) findViewById(R.id.left_drawer); mDrawerList.setAdapter(mDrawerAdapter); } } 

ACTIVIDAD BASE XML

Este diseño xml es para el Navigation Drawer

        

ACTIVIDAD DE TODOS LOS DEMÁS

Otra Activity solo amplía BaseActivity y define el código como se muestra a continuación.

El Navigation Drawer aparecerá para una actividad particular.

mDrawer es de BaseActivity . es una variable protected

 public class Screen1 extends BaseActivity @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); //inflate your activity layout here! View contentView = inflater.inflate(R.layout.screen1, null, false); mDrawer.addView(contentView, 0); //Do the rest as you want for each activity } 

PANTALLA 1 MUESTRA XML

Diseña como quieras cada actividad. ¡no más diseño de Navigation Drawer !

    

NOTA

En esta implementación, The Navigation Drawer no se vincula con la barra de acción. Si desea hacerlo, hágalo en BaseActivity . BaseActivity , esta guía no cubre todos los requisitos. Es solo una muestra.

Hice una actividad BaseActivity que amplía SherlockActivity (o ActionBarActivity si es tu caso)

 public class BaseActivity extends SherlockActivity 

Luego, haga que todas sus actividades amplíen BaseActivity, como:

 public class GlossaryActivity extends BaseActivity 

Más tarde, debe reemplazar el diseño de la actividad con el que corresponda a su actividad, hice un método en BaseActivity de esa manera:

 protected void replaceContentLayout(int sourceId, int destinationId) { View contentLayout = findViewById(destinationId); ViewGroup parent = (ViewGroup) contentLayout.getParent(); int index = parent.indexOfChild(contentLayout); parent.removeView(contentLayout); contentLayout = getLayoutInflater().inflate(sourceId, parent, false); parent.addView(contentLayout, index); } 

Llamé a este método en el método onCreate en cada actividad:

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.replaceContentLayout(R.layout.activity_glossary, super.CONTENT_LAYOUT_ID); } 

super.CONTENT_LAYOUT_ID es FrameLayout de BaseActivity, y otro param es el diseño que desea reemplazar con

@Override de tu clase derivada en onCreate .

ACTUALIZACIÓN: no estoy seguro de cuáles son los efectos de llamar a setContentView dos veces, pero ese podría ser el problema. Separe el código que configura el cajón y onCreate desde ambos métodos onCreate .

También tuve este problema. Esta es mi implementación:

activity_main.xml – el hijo en el índice 1 en el CoordinatorLayout es el content_main.xml , esto puedo cambiar en el código.

      ****     

Creé una clase que usa infla las otras actividades IU:

 public class MyLayoutInflater { public void inflate(Activity activity, int LayoutResource, android.app.ActionBar getSupportActionBar, Intent getIntent){ CoordinatorLayout coordinatorLayout = (CoordinatorLayout) activity.findViewById(R.id.coordinator); android.view.LayoutInflater inflater = (android.view.LayoutInflater) activity .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View contentView = inflater.inflate(LayoutResource, null, false); //change i so that it suits the child number in you coordinator layout int i = 1; coordinatorLayout.removeViewAt(i); coordinatorLayout.addView(contentView, i); getSupportActionBar.setTitle(actionBarTitle); } public void inflate(Activity activity, int LayoutResource, android.support.v7.app.ActionBar getActionBar, String actionBarTitle){ CoordinatorLayout coordinatorLayout = (CoordinatorLayout) activity.findViewById(R.id.coordinator); android.view.LayoutInflater inflater = (android.view.LayoutInflater) activity .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View contentView = inflater.inflate(LayoutResource, null, false); //change i so that it suits the child number in you coordinator layout int i = 1; coordinatorLayout.removeViewAt(i); coordinatorLayout.addView(contentView, i); getActionBar.setTitle(actionBarTitle); } } 

Ahora en las otras actividades todo lo que tienes que hacer es extender la actividad principal y llamar a este método y darle los parámetros necesarios:

 public class AnotherActivity extends MainActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); new MyLayoutInflater().inflate(this,R.layout.content_activity_another, getSupportActionBar(), getIntent()); } } 

Bien, aquí está la forma de hacerlo, lo uso solo para un tipo especial de comstackción de depuración para establecer las propiedades de las vistas en tiempo real (herramienta de diseño).

Tiene la ventaja de que puede usar las actividades de su hijo como siempre , sin un comportamiento especial que se requiere en diferentes respuestas.

entonces en BaseActvity puedes agregar:

 @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // WARNING: Hacky, use carefully!!! ViewGroup androidBaseView = (ViewGroup) findViewById(android.R.id.content); //this one in what child activity has just set in setContentView() ViewGroup childContent = (ViewGroup) androidBaseView.getChildAt(0); View drawerView = LayoutInflater.from(this) .inflate(R.layout.base_activity_drawer, androidBaseView, false); FrameLayout frameLayout = (FrameLayout) drawerView.findViewById(R.id.content); androidBaseView.removeView(childContent); frameLayout.addView(childContent); androidBaseView.addView(drawerView); } 

y xml para cajón es solo: