2011-10-23 57 views
8

Me gustaría implementar un diseño de Fragmentos múltiples de una sola actividad en mi aplicación. Planeo tener varias "pantallas" (diseños de Fragment) a las que cambiaré (posiblemente agregando a back-stack) en el código.Android - Cambiar diseño de fragmento en tiempo de ejecución

A mi entender, el diseño de los fragmentos en cada pantalla se establece mediante objetos de diseño (por ejemplo, FrameLayout), que actúan como marcadores de posición para los fragmentos (comparten la misma ID). Como las diferentes pantallas tienen diferentes arreglos de Fragmentos (uno podría ser FrameLayout y otro LinearLayout, etc.) me preguntaba: ¿Cómo cambio entre diseños de fragmentos en tiempo de ejecución?

Entiendo agregar/reemplazar Fragmentos (a través de FragmentManager), pero me gustaría agregar completamente un nuevo diseño que los contenga, dentro de una actividad en vivo. Algo así como tener transacciones para "setContentView" ...

¿Cómo puedo hacer esto? Gracias! Danny.

+0

Publiqué código de varios fragmentos de actividad simple aquí: http://stackoverflow.com/questions/7797389/how-avoid-re-initializing-activity-that-takes-a-long-time-to-initilize/ 7799391 # 7799391 – user999717

+0

Gracias por la respuesta rápida. Sin embargo, creo que cambiar entre fragmentos en el mismo diseño como muestra tu ejemplo ('R.id.mainframe'), no resuelve mi problema, que es cómo cambiar entre diseños de fragmentos. Especialmente si los diseños se crean en código (después de llamar a OnContentView), como mi caso. – DannyA

+0

Oh, ya veo, ¿quieres volver a vincular los fragmentos existentes sin volver a crear instancias de ellos? Eso es interesante. – user999717

Respuesta

4

Es ciertamente posible, lo único que debe hacer es generar sus propias identificaciones. Los ID pueden ser cualquier cosa, pero no deben entrar en conflicto con las identificaciones de aapt (las de R) y no deben ser negativas.

El siguiente ejemplo demuestra esto con un conjunto de identificadores fijos:

public class MainActivity extends Activity { 
    private final int ID_TABLE = 0xA; 
    private final int ID_ROW1 = 0xB; 
    private final int ID_ROW2 = 0xC; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     LinearLayout ll = (LinearLayout) findViewById(R.id.root); 
     TableLayout tl = new TableLayout(this); 
     tl.setId(ID_TABLE); 
     TableRow tr1 = new TableRow(this); 
     tr1.setId(ID_ROW1); 
     TableRow tr2 = new TableRow(this); 
     tr2.setId(ID_ROW2); 
     tl.addView(tr1); 
     tl.addView(tr2); 
     ll.addView(tl); 

     MyFragment frag1 = new MyFragment(); 
     MyFragment frag2 = new MyFragment(); 
     MyFragment frag3 = new MyFragment(); 
     MyFragment frag4 = new MyFragment(); 

     getFragmentManager().beginTransaction() 
      .add(ID_ROW1, frag1, "cell1_1") 
      .add(ID_ROW1, frag2, "cell1_2") 
      .add(ID_ROW2, frag3, "cell2_1") 
      .add(ID_ROW2, frag4, "cell2_2") 
      .commit(); 
     getFragmentManager().executePendingTransactions(); 
    } 
} 

Con el fin de cambiar a un diseño diferente, puede quitar los fragmentos y añadirlos a otra parte.
Avísame cómo te va.

EDITAR: para aclarar, las vistas y grupos de vistas no necesitan ser instanciadas una vez y luego mantenerse durante la vida de la actividad. Solo asegúrate de que los fragmentos se eliminen o quiten antes de eliminar su vista asociada. Además, si crea y elimina vistas fuera de onCreate, debe asegurarse de que se pueda restaurar utilizando onSaveInstanceState y repitiendo el proceso en onCreate. Lea el diagram here y el párrafo sobre configuration changes.

+0

¡Gracias por el esfuerzo! Como soy un novato de Android, quiero asegurarme de que te entendí correctamente: ¿está bien agregar/eliminar vistas y diseños desde la vista principal de mi actividad prácticamente en cualquier parte de mi código, y no solo en el onCreate (I no creo que haya visto ejemplos para esto), y luego crear y agregar fragmentos sobre la marcha? Es un poco más que simplemente "eliminar los fragmentos y agregarlos a otro lugar", porque creo un nuevo diseño para ellos. – DannyA

+0

El objetivo es eventualmente separar esta lógica de Fragmentos en diferentes clases de "pantalla", y hacer que cada clase conozca sus propios ID de diseño y poner sus propios fragmentos en ellos. Entonces puedo navegar de una "pantalla" a otra a través de transacciones de fragmentos. p.ej. esconde todos los fragmentos de la pantalla anterior y muestra los nuevos fragmentos en su lugar. Debo admitir que esta técnica parece un poco extraña, ya que inundar mi actividad con diseños vacíos con fragmentos invisibles ... Parece que mi objetivo es razonable, pero no he encontrado el diseño correcto para él. – DannyA

+0

Bueno, eso es una forma interesante de pensar, pero ¿no es exactamente por eso que se hicieron las actividades y su método startActivity (Intención)? También recuperas la funcionalidad del botón gratis. – user999717

Cuestiones relacionadas