web-dev-qa-db-fra.com

Accéder à la vue des fragments à partir de l'activité onCreate

Je suis en train de créer ma première application pour Android, et j'ai un Fragment qui est ajouté à mon Activity dans la Activity's onCreate() méthode. Le problème auquel je suis confronté est que je ne trouve aucune des vues contenues dans le Fragment à partir de la méthode ActivityonCreate().

D'autres threads ont suggéré que c'est parce que le Fragment n'a pas encore été gonflé, donc findViewById() renverra null pour toutes les vues contenues dans le Fragment.

Voici ce que je veux dire:

Activité:

@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");
}

Fragment:

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

Cela imprime les résultats:

activité onCréer fin d'activité onCréer fragment onCreateView

En raison de cet ordre, toute tentative d'accès aux vues de Fragment dans la méthode onCreate() de Activity (en utilisant findViewById()) produit un NullPointerException, car Fragment's onCreateView() n'est appelé qu'APRÈS la fin de Activity's onCreate().

L'utilisation de FragmentManger de executePendingTransactions() après l'ajout de Fragment n'aide pas.

Fondamentalement, j'ai été forcé de mettre le code du problème dans la méthode onStart() de Activity au lieu de onCreate(), car onStart() se produit APRÈS la Fragment's onCreateView().

Quelqu'un a-t-il une pratique standard ici, ou comment faire pour que mon code d'accès à la vue de fragment fonctionne dans la méthode onCreate() de Activity?

28
Dan

Mettez à jour vos vues dans 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;
}

Ou si vos modifications dépendent de Activity à laquelle votre Fragment est attaché, utilisez onActivityCreated().

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

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