J'ai une application pour tablette de travail que j'essaie maintenant de faire fonctionner aussi sur les téléphones. Sur une table, il y a deux fragments à l'écran, un fragment de liste et un fragment de détail. 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 valide à 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 le cadre de 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 de la manière suivante.
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 la valeur null lorsque l'application est exécutée sur un téléphone où un seul fragment est affiché.
Des idées? Malheureusement, il n'y a pas beaucoup d'exemples de fragments disponibles en ligne.
Déplacez votre appel de méthode à exécuter pendant onCreateView
et utilisez la vue que vous gonflez 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()
expliquant pourquoi elle renvoie null avant onCreateView(LayoutInflater, ViewGroup, Bundle)
:
getView () Obtenir 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 vers onCreateView()
ne m'a pas aidé.so ... Créer 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 méthode onViewCreated()
-, que vous devez remplacer. N'oubliez pas d'appeler super()
dessus.
Vous devez vérifier la Android cycle de vie pour comprendre POURQUOI est-il nul sur la fonction onAttach (...).
La première fonction appelée lorsque fragment est créé est ajoutée est onAttach () , mais aucune vue n'a été créée. C'est pourquoi la valeur null est renvoyée 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 c’est seulement à partir de cet appel où un objet de vue existe et peut être consulté.
Lire et apprendre le cycle de vie complet ici .
Salutations
Parce que onCreate () est appelé avant onCreateView (), que vous gonfliez ou non une vue dans onCreateView (), getView () ne produira rien dans onCreate (), car à ce moment-là, onCreate () a pas encore été appelé.
elle devient nulle essentiellement parce que vous appelez getview()
avant que la vue ne soit gonflée. Créez un objet View
et remplissez-le avec inflater
puis trouvez votre élément d'interface utilisateur (voir 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;