wake-up-neo.com

getView gibt null zurück, wenn aus einer Aktivität ein Fragment erstellt wurde

Ich habe eine funktionierende Tablet-Anwendung, die ich jetzt auch für Handys verwenden möchte. Auf einem Tisch befinden sich zwei Fragmente auf dem Bildschirm, ein Listenfragment und ein Detailfragment. Auf einem Telefon wird das Listenfragment angezeigt und erstellt eine neue Aktivität, wenn ein Listenelement gedrückt wird. Diese Aktivität erstellt einfach das Fragment in der onCreate() -Methode und schreibt es wie folgt auf dem Bildschirm fest.

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

Dies funktioniert wie erwartet. In dieser Aktivität muss ich dem Fragment jedoch mitteilen, welche Details geladen und angezeigt werden sollen. In meiner DealDetailsFragment-Klasse habe ich eine updateDeal() -Methode, die den Inhalt wie folgt aktualisiert.

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() gibt null zurück, wenn die Anwendung auf einem Telefon ausgeführt wird, auf dem nur ein einzelnes Fragment angezeigt wird.

Irgendwelche Ideen? Leider sind nicht viele Fragmentbeispiele online verfügbar.

58
bencallis

Verschieben Sie den Methodenaufruf, der während onCreateView ausgeführt werden soll, und verwenden Sie die Ansicht, die Sie aufblasen, als Referenz anstelle von getView(). Weitere Informationen finden Sie im Fragment-Lebenszyklus: https://developer.Android.com/guide/components/fragments.html#Creating

und die Dokumentation von getView(), die erklärt, warum es null zurückgibt, bevor onCreateView(LayoutInflater, ViewGroup, Bundle) zurückgibt:

getView () Ruft die Stammansicht für das Layout des Fragments ab (die von onCreateView (LayoutInflater, ViewGroup, Bundle) zurückgegebene Ansicht), sofern bereitgestellt.

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

123
Jason Robinson

Das Verschieben der Methode nach onCreateView() hat mir nicht geholfen. Erstellen Sie eine globale Variable mView

 protected View mView;

und in 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;
}

und ersetze all deine getView() durch mView

21
spaceMonkey

Sie können dies beheben, indem Sie Ihren Code in die onViewCreated()- -Methode einfügen, die Sie überschreiben sollten. Vergiss nicht, super() aufzurufen.

8
Joaquin Iurchuk

Sie müssen den Lebenszyklus von Android) überprüfen, um zu verstehen, WARUM es bei der Funktion onAttach (...) null ist.

Die erste Funktion, die beim Erstellen eines Fragments aufgerufen wird, ist onAttach () , es wurde jedoch keine Ansicht erstellt. Aus diesem Grund wird null zurückgegeben, wenn Sie versuchen, innerhalb dieses Aufrufs zuzugreifen.

Nächste Funktion ist onCreate () ... aber es wurde noch keine Ansicht erstellt !!!!

Die dritte aufgerufene Funktion ist onCreateView () . Hier müssen Sie angeben, welche Ansicht an dieses Fragment angehängt ist Von diesem Aufruf aus, in dem ein Ansichtsobjekt existiert und auf das zugegriffen werden kann.

Lesen und lernen Sie den gesamten Lebenszyklus hier .

Schöne Grüße

4
Anibal Itriago

Da onCreate () vor onCreateView () aufgerufen wird, erhalten Sie durch getView () in onCreate () nichts, unabhängig davon, ob Sie eine Ansicht in onCreateView () aufblasen oder nicht, da in dieser Zeit onCreate () hat noch nicht aufgerufen.

Android Lifecycle

2
Jack Shen

es wird im Grunde genommen null, weil Sie getview() aufrufen, bevor die Ansicht aufgeblasen wird. Erstellen Sie ein View -Objekt und füllen Sie es mit inflater und suchen Sie dann Ihr UI-Element (siehe Code unten)

  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