Frage findViewById in Fragment


Ich versuche, ein ImageView in einem Fragment zu erstellen, das auf das ImageView-Element verweist, das ich im XML für das Fragment erstellt habe. Aber die findViewById Methode funktioniert nur, wenn ich eine Aktivitätsklasse erweitere. Gibt es das überhaupt, von dem ich es in Fragment auch benutzen kann?

public class TestClass extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ImageView imageView = (ImageView)findViewById(R.id.my_image);
        return inflater.inflate(R.layout.testclassfragment, container, false);
    }
}

Das findViewById Methode hat einen Fehler, der besagt, dass die Methode nicht definiert ist.


842
2018-06-27 16:24


Ursprung


Antworten:


Benutzen getView () oder der View-Parameter aus der Implementierung der onViewCreated Methode. Es gibt die Stammansicht für das Fragment zurück (Der eine kam zurück onCreateView() Methode). Mit diesem können Sie anrufen findViewById().

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    ImageView imageView = (ImageView) getView().findViewById(R.id.foo);
    // or  (ImageView) view.findViewById(R.id.foo); 

Wie getView() funktioniert erst nach onCreateView(), Sie kann es nicht im Inneren verwenden onCreate() oder onCreateView() Methoden des Fragments.


1224
2018-06-27 16:34



Sie müssen die Ansicht des Fragments aufblähen und anrufen findViewById() auf der View es kehrt zurück.

public View onCreateView(LayoutInflater inflater, 
                         ViewGroup container, 
                         Bundle savedInstanceState) {
     View view = inflater.inflate(R.layout.testclassfragment, container, false);
     ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
     return view;
}

553
2018-06-27 16:35



Innerhalb Fragment Klasse wirst du bekommen onViewCreated () override-Methode, bei der Sie Ihre Ansichten immer initialisieren sollten, da Sie in dieser Methode View-Objekte erhalten, mit denen Sie Ihre Ansichten wie folgt finden können:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    view.findViewById(R.id.yourId).setOnClickListener(this);

    // or
    getActivity().findViewById(R.id.yourId).setOnClickListener(this);
}

Denken Sie immer daran, dass im Falle eines Fragments onViewCreated() Methode wird nicht automatisch aufgerufen, wenn Sie null oder zurückgeben super.onCreateView() von onCreateView() Methode. Es wird standardmäßig im Fall von aufgerufen ListFragment wie ListFragment Rückkehr FrameLayout standardmäßig.

Hinweis: Sie können die Fragmentansicht an einer beliebigen Stelle in der Klasse mithilfe von verwenden getView() Einmal onCreateView() wurde erfolgreich ausgeführt.  d.h.

getView().findViewById("your view id");

115
2018-03-04 14:46



Ich weiß, das ist eine alte Frage, aber die vorherrschende Antwort lässt etwas zu wünschen übrig.

Die Frage ist nicht klar, was erforderlich ist imageView - geben wir es als Sicht zurück oder speichern wir einfach eine Referenz für später?

Wie auch immer, wenn die ImageView kommt aus dem überhöhten Layout, der richtige Weg dies zu tun wäre:

public class TestClass extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.testclassfragment, container, false);
        ImageView imageView = (ImageView)v.findViewById(R.id.my_image);
        return v;
    }
}

61
2018-04-11 10:46



Erhalten Sie zuerst die Fragmentansicht und dann von dieser Ansicht Ihr ImageView.

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.testclassfragment, container, false);
    ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
    return view;
}

41
2018-06-27 16:35



Du könntest es auch tun in onActivityCreated Methode.

public void onActivityCreated(Bundle savedInstanceState) { 
      super.onActivityCreated(savedInstanceState);
}

Wie sie es hier tun: http://developer.android.com/reference/android/app/Fragment.html  (in API-Ebene 28 nicht mehr unterstützt)

getView().findViewById(R.id.foo);

und

getActivity().findViewById(R.id.foo);

Sind möglich.


19
2017-10-09 23:22



getView() gibt die Grundansicht

View v = getView().findViewByID(R.id.x); 

18
2017-09-03 12:41



Sie können onViewCreated () überschreiben, das direkt aufgerufen wird, nachdem alle Ansichten aufgebläht wurden. Es ist der richtige Ort, um das Mitglied Ihres Fragments auszufüllen View Variablen. Hier ist ein Beispiel:

class GalleryFragment extends Fragment {
    private Gallery gallery;

    (...)

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        gallery = (Gallery) view.findViewById(R.id.gallery);
        gallery.setAdapter(adapter);
        super.onViewCreated(view, savedInstanceState);
    }
}

17
2018-03-28 15:58



Die Methode getView () nicht an Fragmenten außerhalb von OnCreate und ähnlichen Methoden arbeiten.

Sie haben zwei Möglichkeiten, die Sicht an die Funktion oncreate zu übergeben (was bedeutet, dass Sie Ihre Funktionen nur ausführen können, wenn die Sicht erstellt wird) oder die Sicht als Variable festlegen:

private View rootView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
    rootView = inflater.inflate(R.layout.fragment_contatos, container, false);
}

public void doSomething () {
    ImageView thumbnail = (ImageView) rootView.findViewById(R.id.someId);
}

13
2018-03-30 01:02



EditText name = (EditText) getView().findViewById(R.id.editText1);
EditText add = (EditText) getView().findViewById(R.id.editText2);  

10
2017-12-20 13:03