getView retourner null lorsque fragment a été créé à partir d'une activité
Je dispose d'une application pour tablette qui je suis maintenant essayer de rendre le travail sur les téléphones aussi.
Sur une table il y a deux fragments sur l'écran une liste de fragment et un détails fragment.
Lorsque sur un téléphone de la liste fragment apparaît et crée une nouvelle activité quand un élément de la liste est pressé.
Cette activité crée simplement le fragment dans le onCreate()
méthode et l'engage à 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 à partir de l'intérieur de cette activité, j'ai besoin de dire le fragment quels sont les détails que pour charger et afficher. Dans mon DealDetailsFragment classe j'ai un updateDeal()
méthode 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()
est de retourner la valeur null lorsque l'application est exécutée sur un téléphone où il n'existe qu'un seul fragment montré.
Des idées? Malheureusement, il n'y a pas beaucoup de fragment exemples disponibles en ligne.
- À ce point dans le Fragment du cycle de vie est le updateDeal méthode appelée?
- Lorsque le fragment a été créé et chargé.
- quelle méthode spécifiquement? onCreate? onCreateView? onStart? onResume?
- Actuellement dans onCreate. J'ai aussi essayé dans onStart.
- Consultez la rubrique suivante: stackoverflow.com/questions/14789519/...
Vous devez vous connecter pour publier un commentaire.
Déplacer votre appel de méthode à exécuter pendant la
onCreateView
, et l'utilisation de la vue vous sont gonflage de référence au lieu degetView()
. Voir le fragment du cycle de vie pour en savoir plus: https://developer.android.com/guide/components/fragments.html#Creatinget la documentation de
getView()
qui explique pourquoi elle retourne null avant deonCreateView(LayoutInflater, ViewGroup, Bundle)
retourne:https://developer.android.com/reference/android/app/Fragment.html#getView()
onViewCreated()
dans le cycle de vie. Assurez-vous également que vous êtes en train de retourner une valeur non nulle de la Vue au cours deonCreateView()
.Le déplacement de la méthode de
onCreateView()
ne m'aide pas.alors... Créer une variable globalemView
et dans onCreateView()
et de le remplacer tous vos
getView()
avecmView
Vous pouvez corriger cela en mettant votre code à l'intérieur de la
onViewCreated()
-méthode, vous devez remplacer. N'oubliez pas d'appelersuper()
sur elle.getView()
en dehors du cycle de vie des méthodes.Vous devez vérifier la Android Cycle de vie afin de comprendre POURQUOI est-il nul sur
onAttach(...) de la fonction.
La première fonction appelée lorsque le fragment est créé est ajouté onAttach(), mais en réalité aucun point de vue a été créé. C'est pourquoi la valeur null est renvoyée lorsque vous essayez d'accéder à l'intérieur de cet appel.
Fonction suivante est onCreate()... mais il n'y a aucun point de vue encore!!!!
La troisième fonction est appelée onCreateView(), et c'est là où vous devez indiquer qui est le point de vue attachés à 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ée avant onCreateView() , si vous gonfler à vue dans onCreateView() ou pas, vous allez rien obtenir par le biais de getView() dans onCreate(), parce qu'en ce moment , onCreate() n'a pas été appelé encore .
il devient nulle essentiellement parce que vous appelez
getview()
avant le point de vue d'être gonflé. Créer unView
objet et le fond à l'aide deinflater
, puis trouver votre élément de l'INTERFACE utilisateur, voir code ci-dessous