web-dev-qa-db-fra.com

getView renvoie la valeur null lorsque le fragment a été créé à partir d'une activité

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.

58
bencallis

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 ()

123
Jason Robinson

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

21
spaceMonkey

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.

8
Joaquin Iurchuk

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

4
Anibal Itriago

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é.

Android Lifecycle

2
Jack Shen

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;
1
Code_Worm