2011-08-03 15 views
25

Tengo un fragmento agregado empleandoObtener vista de contenedores del fragmento de Identificación del

transaction.add(R.id.content, fragment, null); 

y tengo que empezar de nuevo fragmento de éste. Pero para hacer esto necesito saber el ID de la vista del contenedor del primer fragmento (R.id.content en mi caso). ¿Cómo puedo conseguir esto?

Solo puedo usar esta identificación directamente, pero supongo que el fragmento no debería conocer ese tipo de detalles sobre la actividad de los padres. Por ejemplo, será imposible usar este fragmento en otra actividad en este caso.

¿Puede ser "comenzar" el fragmento de otro es una mala práctica y toda la lógica de manejo de fragmentos debe ser manejada por la actividad misma? Pero crear secuencias agradables de fragmentos comenzando entre sí parece bastante útil (por ejemplo, detalView-> moreDetailView-> evenMoreDetailView).

Respuesta

65

Puede acceder Identificación del contenedor llamando

((ViewGroup)getView().getParent()).getId(); 
+3

me da nulidad alguna idea, tengo la pantalla principal que contiene el diseño que utilizo como padre para los fragements cuando trato de decir LinearLayout x = (LinearLayout) ((ViewGroup) getView().getParent()); en la clase Fragment llámenos pero siempre es nulo – AMH

+0

Funcionando como un amuleto, gracias hombre por salvarme las horas –

11

No sé si entiendo exactamente su pregunta, pero obtiene el contenedor en onCreateView. Supongo que podrías esconderlo en una variable local.

public View onCreateView(LayoutInflater inflater, 
    ViewGroup container, 
    Bundle savedInstanceState) { 
    mContainer = container; 
    ... 
} 
+0

Lo entiendes bien. Puedo hacerlo de esta manera, pero parece más como un truco para mí. El contenedor aquí se pasa por fragmento para poder inflar su vista y dudo que se suponga que se almacena para un uso futuro. ¿Existe algún tipo de forma más nativa de obtener ID de vista de contenedor? –

+1

No veo cuál es el problema con este método. Si no desea almacenar la vista, simplemente almacene la identificación. –

5

Suponiendo que tener una instancia del Fragmento mCurrentFragment en la clase de actividad. Usted puede obtener de Fragmento de contenedores Ver a través de

int id = mCurrentFragment.getView().getParent().getId(); 
ViewGroup vg = (ViewGroup) findViewById(id); // Fragment's container View 
+1

(Si entiendo correctamente lo que está haciendo) El objeto que obtuvo la identificación de ** es ** el objeto que está buscando para. Esas dos líneas pueden ser reemplazadas por la más corta: 'ViewGroup vg = (ViewGroup) mCurrentFragment.getView(). GetParent();' ¿Alguna situación donde esto no sería equivalente a lo que hiciste? – ToolmakerSteve

+0

Yep @ToolmakerSteve, siempre son equivalentes. Gracias por descubrir eso por mí. –

8

Creo que hay una manera más estándar de acceder a la vista en lugar de utilizar

((ViewGroup) getView().getParent()).getId() 

voy a suponer que usted está trabajando con un MainActivity que presenta una fragmento de lista, que luego puede presentar otro fragmento de lista al hacer clic en un elemento, y así sucesivamente. Supongo que ha elegido reemplazar la vista principal de MainActivity por el contenido de los fragmentos de lista que presenta.

Como cada fragmento de lista se aloja en la actividad principal, siempre puede acceder a la vista de la actividad principal.

// Inside of onListItemClick... 
FragmentManager fm = getFragmentManager(); 
Fragment fragment = new MyOtherListFragment(); 

FrameLayout contentView = (FrameLayout) getActivity().findViewById(R.id.content_view); 

fm.beginTransaction() 
     .replace(contentView.getId(), fragment) 
     .addToBackStack(null) 
     .commit(); 

El ejemplo anterior asume que tiene un recurso de diseño XML que se establece en el MainActivity, llame al recurso XML R.layout.activity_main, donde hay una FrameLayout con el id R.id.content_view. Este es el enfoque que tomé. El ejemplo que presento aquí es una versión más simple de la que realmente escribí en mi aplicación.

Por cierto, mi versión de IntelliJ (versión 1.0.1) me advierte que

((ViewGroup) getView().getParent) 

puede lanzar una NullPointerException.

+1

Bueno, unas semanas después de esta pregunta, he entendido que el diseño de Fragmentos es defectuoso más allá del punto de usabilidad y nunca más he usado Fragmentos. –

Cuestiones relacionadas