2011-02-07 17 views
15

Estoy desarrollando una aplicación que contiene muchas actividades y creé mi propio menú (no quiero usar el botón de menú incorporado) con el cajón deslizante ya que el cajón deslizante está en la parte inferior de la pantalla y contiene mis botones del menúcajón deslizante aparece en todas las actividades

lo que necesito es hacer que el cajón deslizante que aparezca en todas mis actividades

i trató de crear una actividad y fijar su vista contenidos en el fichero XML que incluye el cajón y se extiende después de que la actividad en todas las demás actividades, pero esta solución no funciona

¿Alguna sugerencia?

Respuesta

40

La extensión es la manera correcta. Simplemente anule setContentView de la manera correcta. Aquí está el ejemplo de trabajo, pero en lugar de cajón, yo uso un creado una barra de pestañas personalizado:

definir un diseño con su cajón de la siguiente manera:

esto es act_layout.xml

<LinearLayout 
    ... 
    android:orientation="vertical" 
> 
    <YourDrawer 
    ... 
    /> 
    <FrameLayout 
    android:id="@+id/act_content" 
    ... 
    > 
    // Here will be all activity content placed 
    </FrameLayout> 
</LinearLayout> 

Ésta será su diseño base para contener todos los demás diseños en el marco act_content. A continuación, cree una clase de actividad de base, y haga lo siguiente:

public abstract class DrawerActivity extends Activity { 

    protected LinearLayout fullLayout; 
    protected FrameLayout actContent; 

    @Override 
    public void setContentView(final int layoutResID) { 
     // Your base layout here 
     fullLayout= (LinearLayout) getLayoutInflater().inflate(R.layout.act_layout, null); 
     actContent= (FrameLayout) fullLayout.findViewById(R.id.act_content); 

     // Setting the content of layout your provided to the act_content frame 
     getLayoutInflater().inflate(layoutResID, actContent, true); 
     super.setContentView(fullLayout); 

     // here you can get your drawer buttons and define how they 
     // should behave and what must they do, so you won't be 
     // needing to repeat it in every activity class 
    } 
} 

Lo que hacemos, es básicamente interceptar todas las llamadas a setContentView (int resid), inflar nuestra disposición para el cajón de XML, inflar nuestra disposición para la actividad (mediante reId proporcionado en la llamada al método), combínelos según lo necesitemos y configúrelos como contentView de la actividad.

EDIT: Después de crear las cosas arriba, solo procederá a escribir una aplicación como de costumbre, crear diseños (sin ninguna mención de un cajón) crear actividades, pero en lugar de extender la actividad simple, se extienden DrawerActivity, de este modo:

public abstract class SomeActivity extends DrawerActivity { 

    protected void onCreate(Bundle bundle) { 
     setContentView(R.layout.some_layout); 
    } 
} 

¿Qué ocurre, es que setContentView (R.layout.some_layout) es interceptada. Your DrawerActivity carga el diseño que proporcionó desde xml, carga un diseño estándar para su cajón, los combina y luego lo configura como contentView para la actividad.

+0

gracias por su respuesta, pero no entiendo el tema, por favor, explíqueme más, hice lo que me dijo, creé una clase para dibujar el cajón deslizante y lo extiendo a otra clase la salida es que tengo el cajón correctamente en la pantalla, pero no puedo establecer la vista de la actividad del niño, ¿cómo podría hacer eso? – Zak

+0

Lo más importante es combinar 2 diseños (de actividad y el que está en el cajón) en 1 y solo luego configúralo con setContentView. Lo que sugiero es inflar ambos diseños desde xml (de esa manera aún no se llama a setContentView) combínelos programáticamente de la forma que desee y luego llame a setContentView (your_combinet_view). Es lo que hice cuando superé el setContentView en DrawerActivity. Agregaré el ejemplo de una actividad simple que debe ampliarlo. –

+0

cansé tu sugerencia y los combiné como lo hiciste en el ejemplo proporcionado y de la clase hija llamo al setContentView y le paso el ID de raíz del xml de mi nueva actividad public class AlJazeera extends MenuSlider { \t Context ctx = this ; \t protegido FrameLayout Layout; /** Se invoca cuando se crea la actividad por primera vez. */ @Override public void onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.id.idl); } } – Zak

2

Sé que esto es dos años de retraso, pero para aquellos que quieran una respuesta aquí está. El señor Orlov tuvo una respuesta adecuada, solo se necesitan algunos ajustes.

  • borrar el resumen después de public. (Esto es lo que causa un error)
  • envuelven tanto a su cajón deslizante y FrameLayout con otro FrameLayout y definir el ancho y la altura de match_parent. (Esto permite que aparezcan AMBOS diseños).

TAMBIÉN: Si desea que su cajón deslizante aparezca en la parte superior de su diseño (¡duh!), Coloque el frameLayout que está detrás del deslizador deslizante antes de deslizar el Drawer.

+0

Hola, probé tu sugerencia pero estoy enfrentando algunos problemas. ¿Puedes por favor dar el plan de archivo de diseño como el formato xml? – itsrajesh4uguys

14

Finalmente después de 3 años, aquí está la solución completa a esta pregunta importante para los cuales no puede haber sido completamente guiada por la respuesta del señor Orlov.

Su método para hacer una vista de jerarquía estaba completamente bien pero había algunos pequeños errores que pueden confundir a los desarrolladores principiantes.

  1. Como también mencionaste Gabe, puedes deshacerte del resumen en la declaración.
  2. No es necesario envolver a ambos hijos con FrameLayout. El padre podría ser cualquier RelativeLayout, LinearLayout, etc. Pero la parte más importante es que debe declarar el FrameLayout antes del control deslizante.

Así que el trabajo soloution 100% sería así:

activity_drawer.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 

<FrameLayout 
    android:id="@+id/drawer_frame" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

<YourDrawer 
    android:id="@+id/drawer_drawer" 
    android:layout_width="match_parent" 
    android:layout_height="fill_parent" > 

</YourDrawer> 

</RelativeLayout> 

DrawerActivity.java

public class DrawerActivity extends Activity { 

protected RelativeLayout fullLayout; 
protected FrameLayout frameLayout; 

@Override 
public void setContentView(int layoutResID) { 

    fullLayout = (RelativeLayout) getLayoutInflater().inflate(R.layout.activity_drawer, null); 
    frameLayout = (FrameLayout) fullLayout.findViewById(R.id.drawer_frame); 

    getLayoutInflater().inflate(layoutResID, frameLayout, true); 

    super.setContentView(fullLayout); 

    //Your drawer content... 

} 

} 

MainActivity.java

public class MainActivity extends DrawerActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

} 

} 

No olvide declarar DrawerActivity en manifiesto.

Espero que haya sido de ayuda.

+0

Gracias. se aclararon las cosas :) – user2729183

+0

No tengo la actividad del cajón en mi archivo de manifiesto y todavía funciona bien. Eso sí, estoy en 23.0.1 ahora. – Stephane

Cuestiones relacionadas