2012-08-25 19 views
26

Estoy en el proceso de hacer mi primera aplicación para Android, y tengo un Fragment que se agrega a mi Activity en onCreate() método de la Activity 's. El problema al que me enfrento es que no puedo encontrar ninguna de las vistas contenidas en el Fragment del Activity del método onCreate().acceso Fragmento Vista desde onCreate de Actividad

Otros hilos han sugerido que esto se debe a que Fragment aún no se ha inflado, por lo que findViewById() devolverá nulo para las vistas contenidas en Fragment.

Esto es lo que quiero decir:

Actividad:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    System.out.println("activity onCreate"); 
    setContentView(R.layout.activity_main); 

    if (savedInstanceState != null) { 
     return; 
    } 

    initialiseUI(); // Fragment added to Activity 

    System.out.println("end of activity onCreate"); 
} 

Fragmento:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 
System.out.println("fragment onCreateView"); 
    return inflater.inflate(R.layout.event_log, container, false); 
} 

Esto imprime los resultados:

actividad onCreate final de la actividad alcrear fragmento onCreateView

Debido a este fin, cualquier intento de acceder a los puntos de vista de la Fragment en el Activity 'método s onCreate() (usando findViewById()) produce una NullPointerException, como el Fragment' s onCreateView() sólo se obtiene la llamada después del final de las Activity 's onCreate().

Usar FragmentManger's executePendingTransactions() después de agregar Fragment no ayuda.

Básicamente, me he visto obligado a poner el código de problema en el Activity 'onStart() método en lugar de onCreate() s, como sucede después de la onStart()Fragment' s onCreateView().

¿Alguien es la práctica habitual aquí, o cómo puedo hacer que mi código Fragment-View-accessing funcione dentro del método ActivityonCreate()?

+1

¿Por qué quiere acceder a la vista de 'Fragment' en onCreate método' 'Activity' de()? Algo está mal con tu diseño. – biegleux

+0

Específicamente, después de agregar un Fragmento en el método onCreate() de la Actividad, deseo cambiar el texto de un TextView contenido dentro del Fragment y agregar algunos elementos a un Spinner. ¿Qué podría estar mal con mi diseño? – Dan

+0

Luego actualiza el diseño de tu fragmento en el método 'onCreateView()' de 'Fragment'. Ver mi respuesta – biegleux

Respuesta

19

Actualice sus puntos de vista en onCreateView().

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.event_log, container, false); 
    TextView tv = (TextView) view.findViewById(R.id.text); 
    tv.setText("hello world"); 
    return view; 
} 

O si los cambios dependen de su ActivityFragment está unido a, utilizar onActivityCreated().

@Override 
public void onActivityCreated (Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    TextView tv = (TextView) getView().findViewById(R.id.text); 
    tv.setText(getActivity.getSomeText()); 
} 
+0

Ok, después de un millón de otros problemas en los que no voy a entrar, finalmente conseguí que funcionara correctamente. Gracias por tu ayuda. – Dan

+1

@Dan, ¿puedes compartir exactamente los otros problemas y cómo usaste los anteriores para resolverlos? Sería una gran contribución de la comunidad. –

+1

Básicamente, traté de usar onActivityCreated() para inicializar mis componentes, pensando que este método solo se llamaría una vez. Esto causó muchos problemas al pausar y reiniciar mi aplicación, ya que este método restablecía todos mis componentes, ya que se llama cada vez. Luego, cuando intenté hacer que esto funcionara usando onCreateView(), utilicé getView(). FindViewById (...) en lugar de usar la variable de "vista" ya inicializada. Fue un error tonto, pero llegué al final! Entonces ahora el texto se almacena en un campo en onCreate() y se coloca en el TextView en onCreateView(). – Dan

Cuestiones relacionadas