2011-07-20 9 views
5

EDIT:diseño con el fragmento y FrameLayout reemplazado por otro fragmento y FrameLayout

Así que después de los comentarios de abajo, yo Revisted y se dio cuenta lo que me estaba colgando.

imaginar mi lista de clientes y la actividad de los detalles del cliente iniciarse por:

public class ClientsMainActivity extends FragmentActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //StudioTabOpenHelper db; 
     setContentView(R.layout.main_client_activity); 
    } 
} 

Así que esto funciona muy bien, se pone en marcha mi main_client_Activity (definida en un diseño que sigue, y yo llamo a esta actividad cuando un botón en mi principal se hace clic en la pantalla):

Intent intent = new Intent(getActivity(), ClientsMainActivity.class); 
startActivity(intent); 

Fácil es el problema, el ClientsMainActivity no dice que una OnCreateView ni nada, sólo establece el diseño de la disposición que define mi Fragmento, y mi ListFragment. Esto está bien porque yo no estoy tratando de pasar nada en el ClientsMainActivity, pero si tengo una actividad hipotética como:

SessionMainsActivity que se llama cuando hacen clic en la sesión de edición de un cliente, entonces yo no estaría llamando a la SessionsMainActivity de la misma manera (inicia la actividad que acaba de establecerse en alayout), me gustaría que el diseño se establezca ya que define cómo se dividen mis fragmentos. Pero también me gustaría pasar los datos a eso y luego a los fragmentos subsiguientes (como en qué sesión hicieron clic para editar/eliminar con.

Así que me pregunto si lo anterior tiene sentido, estoy seguro de que es un simple Lo que no puedo entender es que no tengo problemas para llamar a FragmentActivitie de otros fragmentos, ocupan toda la pantalla, pero funciona. Así que supongo que el gran problema es que ClientsMainActivity es de algún ejemplo que encontré en línea para hacer recetas que le muestra cómo hacer múltiples fragmentos en una pantalla. Lo que me da todo lo que FragmentActivity hace es establecer la vista de contenido, en un diseño que hace todo el trabajo que parece, así que es por eso que no puedo entender cómo codificarlo haga lo mismo pero déjeme pasar los valores a los fragmentos que el diseño define, etc.

FIN EDITAR

Así que estoy usando este pequeño tutorial aquí:

http://developer.android.com/guide/topics/fundamentals/fragments.html

Me ha llegado un largo camino y la utilización de lo que dicen que hacer para la actividad, y fragment_layout.xml, obtuve una buena lista de clientes a la izquierda (Esto es un listfragment) y un fragmento de detalles a la derecha.

Luego agregué la capacidad de editar información de sesión en un cliente (o editar detalles del cliente), ambos de los cuales eran fragmentos de pantalla completa. Esto funcionó muy bien.

Ahora decidí que mi edición de sesión sería mejor si volviera a dividir la información en dos paneles.

Esto no está funcionando como pensaba, como he dicho tengo un main_Activity que hace esto en el onCreate:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_client_activity); 
} 

con el main_client_activity.xml se define en dos diseños, pero el uno para tabletas paisaje está aquí:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <fragment class="com.viciousbytes.studiotab.subactivities.ClientListView" 
     android:id="@+id/client_list" android:layout_weight="1" 
     android:layout_width="0px" android:layout_height="match_parent" /> 

    <FrameLayout android:id="@+id/client_details" android:layout_weight="1" 
     android:layout_width="0px" android:layout_height="match_parent" 
     android:background="?android:attr/detailsElementBackground"/> 

</LinearLayout> 

¡Todo funciona genial! En cuyo caso en que manejé todo lo demás como una actividad de pantalla completa que comenzó su propio fragmento:

EditSessionActivity EditClientActiivyt ambos de los cuales utilizan getSupportFragmentManager() beginTransaction y pude pasar la información en él desde la llamada .newInstance..

Tenía mi diseño session_edit.xml definido con botones, textviews, etc. y eso funcionaba muy bien. Eso es lo que cargué en mi fragmento SessionEdit "lanzado" por mi EditSessionActivity Pero ahora, como quiero dividirlo, me encontré con un problema. Más arriba definí una lista de clientes y una ID de cliente_detalles, ¿están estos marcadores de posición en mi pantalla? ¿Hago referencia a esos cuando quiero reemplazar lo que hay allí con fragmentos totalmente diferentes?

o puedo crear otro diseño fragmento llamado algo así como fragment_session_layout que define algo como:

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <fragment class="com.viciousbytes.studiotab.subactivities.SessionEdit" 
     android:id="@+id/session_edit" android:layout_weight="1" 
     android:layout_width="0px" android:layout_height="match_parent" /> 

    <FrameLayout android:id="@+id/invoice_details" android:layout_weight="1" 
     android:layout_width="0px" android:layout_height="match_parent" 
     android:background="?android:attr/detailsElementBackground" /> 
</LinearLayout> 

En este momento no sé qué título este en la punta de la lengua de lo que estoy pidiendo, básicamente, cómo para obtener dos paneles de fragmentos dos veces. La demostración en línea muestra cómo hacer una (y un simple ListFragment al respecto).

he hecho todo lo anterior y simplemente no puedo encontrar la manera de pasar en el fragmento de los datos que necesito, yo estaba usando esto en mi EditSessionActivity:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    int clientID = getIntent().getIntExtra(THE_SELECTED_CLIENT, -1);    
    int sessionID = getIntent().getIntExtra(SELECTED_SESSION,-1); 
    SessionEdit edits = SessionEdit.newInstance(this.getBaseContext(), false, clientID, sessionID); 
    mUIListener = (OnUpdateUI)edits; 
    getSupportFragmentManager().beginTransaction().add(android.R.id.content, edits).commit(); 
} 

que funcionaba, sino para tratar de adherirse al ejemplo del fragmento anterior, asumí que mi EditSessionActivit y era como hacer otro MainActivity (porque tiene dos paneles como el principal). por lo que la recodificado en onCreateEditSessionActivity con esto:

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

cual después de luchar en mi fragmento EditSession tratar con el onCreateView, Tengo este fin de trabajar pero no pudo pasar en los datos de causa no hay ninguna instancia de la objetar el uso como el anterior onCreate que tenían las edits=SessionEdit.newInstance(...)

lo tanto, es una buena práctica para estar haciendo otro diseño que tiene dos dolores en ella y comenzar que cuando se desencadena la acción correcta. ¿O se supone que debe reemplazar los dos fragmentos ya creados? desde mi main_client_activity.xml de alguna manera?

+0

Tengo el mismo "problema" ahora que he conseguido 2 listfragments en la vista y yo estoy cambiando dinámicamente después de una fila es selected.I pensar mucho cuál es la mejor, pero no creo que esta es la mejor manera de que utilicé – kameny

+0

Los ejemplos de estos fragmentos en línea suelen ser suficientes para casos simples, pero más que eso y usted está solo. Espero que alguien tenga una buena sugerencia. – Codejoy

+0

I aggree contigo, estos tutoriales bueno para situaciones básicas y si alguien quiere crear la interfaz de usuario complicada con fragmentos que necesita pensar mucho: D – kameny

Respuesta

3

Supongo que la edición de clientes y las sesiones de edición son dos actividades distintas. Cuando cambia de "editar clientes" a modo "sesiones de edición", ¿cambiarían los paneles de "lista" y "detalles"?

Iría con dos archivos de diseño, en lugar de tratar de reutilizar el mismo diseño y volver a cargar fragmentos en él.

Si se trató de volver a utilizar el mismo diseño, que tendría que:

  • Cambio @+id/invoice_details a algo así como @+id/right_pane. De lo contrario, parecería confuso cargar algo relacionado con las sesiones en el marcador de posición "invoice_details".
  • reemplace la definición de fragmento con otro FrameLayout y cargue ClientListView o SessionListView (o como se llame) fragmento en el tiempo de ejecución.

Esto agregaría más complejidad que tener otro archivo xml de diseño en mi opinión.

Así

  • Tome su código existente que funciona con la lista de clientes y clientes detalles
  • Duplicar todas las partes involucradas, y cambiar lo que hay que cambiar lo que es ahora la lista de sesión y detalles de la sesión
  • Quitar duplicación donde es fácil de hacer (las funciones comunes van a las clases de utilidad, los elementos comunes de diseño al diseño incluyen). Deje las cosas que son difíciles de duplicar como están.
  • Vuelva a evaluar más adelante, cuando tenga más fragmentos, más diseños y más experiencia.

UPDATE, alrededor de dos fragmentos diferentes enfoques puede ser embebido en la actividad

Como los estados de documentación de Android, hay dos formas principales, usted puede obtener un fragmento que aparece en su actividad:

  • declaran el fragmento en el archivo XML de diseño (<fragment class=.... />)
  • poner un marcador de posición en el fragmento FrameLayout archivo XML y la carga de diseño en tiempo de ejecución

El primer enfoque está bien cuando el fragmento no necesita recibir ningún argumento. Como, por ejemplo, si la lógica para recuperar una única lista de clientes está codificada en código de fragmento.

El segundo enfoque permite pasar argumentos al fragmento y, por lo tanto, es apropiado para el tipo de fragmentos de "detalles detallados".

De la pregunta actualizada entiendo que,

  • cada cliente tiene una lista separada de sesiones
  • los componentes en juego son: EditSessionActivity que aloja dos fragmentos, uno para la lista de sesiones de visualización, otro para la visualización detalles de la sesión

Si eso es correcto, entonces de hecho tendría que cargar ambos fragmentos mediante programación porque ambos necesitan parámetros para pasar. Entonces su diseño tendría dos FrameLayout s. El EditSessionActivity comenzaría con obtener algunos parámetros del intento ("¿con qué lista de sesiones estamos trabajando?") Y cargar el fragmento de "lista de sesiones" con estos parámetros.Cuando el usuario selecciona el elemento de la lista en ese fragmento, el otro fragmento se cargará con los detalles de la sesión.

+0

gracias por la respuesta. Voy a llegar a esto. Creo que el problema más importante es la forma en que funcionaba mi código de diseño: un lado era un ListFragment, el otro lado era un FrameLayout. Así que en mis cosas sesión Quiero dos FrameLayouts (o en este punto serían fragmentos?) Creo que también estaba confundido a cómo pasar algunos objetos complejos (mis propios objetos de datos) a la FragmentActivity en este caso, tal vez sólo hacerlo serializable? No he mirado esto por un tiempo, así que revisaré para ver qué parte me colgó específicamente y volveré a publicar aquí. Si – Codejoy

+0

cosas sesión es análoga a clientes (lista de sesiones de la izquierda, detalles de la sesión a la derecha), entonces creo que su diseño también sería similar: ListFragment a la izquierda, a la derecha FrameLayout. Cuando se selecciona un elemento en la lista de la izquierda, se cargaría un fragmento para editar los detalles de la sesión en FrameLayout. En cuanto a pasar datos: objetos serializables (parcelable) o estado global. O bien, si los objetos provienen de algo así como la base de datos sqlite local, podría pasar los ID de la base de datos y leer los objetos de DB como/cuando sea necesario. –

+0

pregunta bien actualizada para reflejar mi problema principal. – Codejoy

Cuestiones relacionadas