getView renvoyant null quand fragment a été créé à partir d’une activité

J’ai une application pour tablette qui fonctionne et que je tente maintenant de faire fonctionner sur les téléphones. Sur une table, il y a deux fragments à l’écran, un fragment de liste et un fragment de détails. Sur un téléphone, le fragment de liste apparaît et crée une nouvelle activité lorsqu’un élément de la liste est activé. Cette activité crée simplement le fragment dans la méthode onCreate() et le onCreate() à l’écran comme suit.

 // Place an DeallDetailsFragment as our content pane DealDetailsFragment f = new DealDetailsFragment(); getFragmentManager().beginTransaction().add(android.R.id.content, f).commit(); getFragmentManager().executePendingTransactions(); 

Cela fonctionne comme prévu, mais dans cette activité, je dois indiquer au fragment les détails à charger et à afficher. Dans ma classe DealDetailsFragment, j’ai une méthode updateDeal() qui met à jour le contenu comme suit.

 if (deal==null) { // could be null if user presses the loading deals list item before it loads return; } this.deal=deal; if (dealTitle==null) { // get the view objects only once holder = new ViewHolder(); holder.dealHeat=(TextView) getView().findViewById(R.id.dealDetails_heat_textView); holder.dealPrice=(TextView) getView().findViewById(R.id.dealDetails_price_textView); holder.dealRetailer=(TextView) getView().findViewById(R.id.dealDetails_retailer_textView); holder.dealTitle=(TextView) getView().findViewById(R.id.dealDetails_title_textView); holder.dealDesc=(TextView) getView().findViewById(R.id.dealDetails_desc_textView); holder.goToButton= (LinearLayout) getView().findViewById(R.id.dealDetails_goToDeal); holder.dealImage=(ImageView) getView().findViewById(R.id.dealDetails_imageView); holder.postedBy=(TextView) getView().findViewById(R.id.dealDetails_poster_textView); holder.datePosted=(TextView) getView().findViewById(R.id.dealDetails_date_textView); 

getView() renvoie null lorsque l’application est exécutée sur un téléphone sur lequel seul un seul fragment est affiché.

Des idées? Malheureusement, il n’existe pas beaucoup d’exemples de fragments disponibles en ligne.

Déplacez votre appel de méthode pour être exécuté pendant onCreateView , et utilisez la vue que vous getView() pour référence au lieu de getView() . Voir le cycle de vie des fragments pour plus d’informations: https://developer.android.com/guide/components/fragments.html#Creating

et la documentation de getView() qui explique pourquoi elle renvoie null avant le onCreateView(LayoutInflater, ViewGroup, Bundle) :

getView () Récupère la vue racine de la présentation du fragment (celle renvoyée par onCreateView (LayoutInflater, ViewGroup, Bundle)), si elle est fournie.

https://developer.android.com/reference/android/app/Fragment.html#getView ()

Déplacer la méthode sur onCreateView() ne m’a pas aidé … Créez une variable globale mView

  protected View mView; 

et dans onCreateView ()

  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d(TAG, "oncreateView"); super.onCreateView(inflater, container, savedInstanceState); View view = inflater.inflate(R.layout.activity_secure_cloud_drive_folder, container, false); this.mView = view; return view; } 

et le remplacer tous vos getView() avec mView

Vous pouvez résoudre ce problème en plaçant votre code dans la onViewCreated() , que vous devez remplacer. N’oubliez pas d’appeler super() dessus.

Vous devez vérifier le cycle de vie Android pour comprendre pourquoi il est nul sur la fonction onAttach (…).

La première fonction appelée lorsqu’un fragment est créé est onAttach () , mais en réalité aucune vue n’a été créée. C’est pourquoi null est renvoyé lorsque vous essayez d’accéder à cet appel.

La fonction suivante est onCreate () … mais aucune vue n’a encore été créée !!!!

La troisième fonction appelée est onCreateView () , et c’est ici que vous devez indiquer quelle est la vue attachée à ce fragment …. Et ce n’est qu’à partir de cet appel qu’un object vue existe et qu’il est possible d’y accéder.

Lisez et apprenez le cycle de vie complet ici .

Salutations

Comme onCreate () est appelée avant onCreateView (), que vous gonfliez une vue dans onCreateView () ou non, vous n’obtiendrez rien via getView () dans onCreate (), car à ce moment, onCreate () n’a pas encore été appelé. .

Cycle de vie Android

il devient null essentiellement parce que vous appelez getview() avant que la vue ne soit gonflée. Créez un object View et remplissez-le à l’aide de inflater , puis recherchez votre élément d’interface utilisateur, consultez le code ci-dessous.

  View view = inflater.inflate(R.layout.fragment_albumslist, container, false); TextView t= (TextView)view.findViewById(R.id.txtTest); t.setText(strtext); return view;