it-swarm.com.de

findViewById in Fragment

Ich versuche, eine ImageView in einem Fragment zu erstellen, die auf das ImageView-Element verweist, das ich in der XML für das Fragment erstellt habe. Die findViewById-Methode funktioniert jedoch nur, wenn ich eine Activity-Klasse erweitere. Gibt es überhaupt einen, von dem ich ihn auch in Fragment verwenden 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);
    }
}

Die findViewById-Methode enthält einen Fehler, der besagt, dass die Methode nicht definiert ist.

899
simplified.

Verwenden Sie getView () oder den View-Parameter, um die onViewCreated-Methode zu implementieren. Sie gibt die Stammansicht für das Fragment zurück (die von der onCreateView()-Methode zurückgegebene). Damit können Sie findViewById() aufrufen.

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

Da getView() nur nach onCreateView() funktioniert, können Sie nicht in onCreate()- oder onCreateView()-Methoden des Fragments verwenden.

1307
advantej

Sie müssen die Ansicht des Fragments aufblasen und findViewById() für die zurückgegebene View aufrufen.

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;
}
577
LeffelMania

Innerhalb der Fragment-Klasse erhalten Sie eine onViewCreated () override-Methode, bei der Sie Ihre Ansichten immer initialisieren sollten. In dieser Methode erhalten Sie ein Ansichtsobjekt, mit dem Sie Ihre Ansichten wie folgt finden:

@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 bei Fragment immer daran, dass die onViewCreated()-Methode nicht automatisch aufgerufen wird, wenn Sie null oder super.onCreateView() von der onCreateView()-Methode ..__ zurückgeben. Diese wird standardmäßig aufgerufen, wenn ListFragment als ListFragment standardmäßig FrameLayout zurückgegeben wird.

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

getView().findViewById("your view id");
123
Ankur Chaudhary

Mir ist klar, dass dies eine alte Frage ist, aber die vorherrschende Antwort lässt zu wünschen übrig.

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

Wenn der ImageView aus dem aufgeblasenen Layout stammt, wäre dies der richtige Weg:

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;
    }
}
65
MattJenko

Holen Sie sich zuerst die Fragmentansicht und dann Ihre 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;
}
42
xevincent

Sie können dies auch in der onActivityCreated-Methode tun. 

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

So wie sie es hier tun: http://developer.Android.com/reference/Android/app/Fragment.html(in API Level 28 veraltet)

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

und

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

sind möglich.

22
friiky

getView() gibt die Stammansicht aus

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

Sie können onViewCreated () überschreiben, das direkt nach dem Aufblasen aller Ansichten aufgerufen wird. Es ist der richtige Ort, um die Variablen View Ihres Mitglieds auszufüllen. 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
Lez

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

Sie haben zwei Möglichkeiten, die Ansicht an die Funktion in oncreate zu übergeben (was bedeutet, dass Sie Ihre Funktionen nur ausführen können, wenn die Ansicht erstellt wird) oder die Ansicht 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);
}
14
sagits
EditText name = (EditText) getView().findViewById(R.id.editText1);
EditText add = (EditText) getView().findViewById(R.id.editText2);  
10
sandhu

1) Blasen Sie zuerst das Layout von Fragment auf, und verwenden Sie findviewbyId.

View view = inflater.inflate(R.layout.testclassfragment, container, false);
             ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
             return view;
9
priti

stimmte dem Aufruf von findViewById() auf der View zu.

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;
}
9
Pajeh

1) Deklarieren Sie Ihre Layoutdatei. 

public View onCreateView(LayoutInflater inflater,ViewGroup container, 
                                 Bundle savedInstanceState) {
    return inflate(R.layout.myfragment, container, false);
}

2) Holen Sie sich dann die ID Ihrer Ansicht 

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    TextView nameView = (TextView) view.findViewById(R.id.textview1);
}
8
Nanda Gopal

Gemäß der Dokumentation zu API Level 11

Referenz in Back Stack http://developer.Android.com/reference/Android/app/Fragment.html

kurzcode

/**
 * The Fragment's UI is just a simple text view showing its
 * instance number.
 */
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.hello_world, container, false);
    View tv = v.findViewById(R.id.text);
    ((TextView)tv).setText("Fragment #" + mNum);
    tv.setBackgroundDrawable(getResources().getDrawable(Android.R.drawable.gallery_thumb));
    return v;
}
8
Dexter

Mit getView() wird die Ansicht des Fragments zurückgegeben. Anschließend können Sie findViewById() aufrufen, um auf ein beliebiges Ansichtselement in der Fragmentansicht zuzugreifen.

8
Mahmoud Badri

Benutzen 

imagebutton = (ImageButton) getActivity().findViewById(R.id.imagebutton1);

imageview = (ImageView) getActivity().findViewById(R.id.imageview1);

es wird klappen

8
Manoj ahirwar

Hinweis :

Ab API Level 26 müssen Sie das Ergebnis von findViewById nicht speziell umwandeln, da Inferenz für den Rückgabetyp verwendet wird.

So können Sie jetzt einfach tun,

public View onCreateView(LayoutInflater inflater, 
                         ViewGroup container, 
                         Bundle savedInstanceState) {
     View view = inflater.inflate(R.layout.testclassfragment, container, false);
     ImageView imageView =  view.findViewById(R.id.my_image); //without casting the return type
     return view;
}
8
Novo Lucas

Probieren Sie es aus, es funktioniert für mich 

public class TestClass extends Fragment {
    private ImageView imageView;

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

    private void findViews(View view) {
        imageView = (ImageView) view.findViewById(R.id.my_image);
    }
}
7
Bipin Bharti

Es gibt eine weitere Methode namens onViewCreated.

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    ImageView imageView = (ImageView) view.findViewById(R.id.imageview1);
}
5
Raja Jawahar

versuchen

private View myFragmentView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{
myFragmentView = inflater.inflate(R.layout.myLayoutId, container, false);
myView = myFragmentView.findViewById(R.id.myIdTag)
return myFragmentView;
}
5
Ramkumar.M

Am besten implementieren Sie dies wie folgt: 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

rootView = inflater.inflate(R.layout.testclassfragment, container, false);
        ImageView imageView = (ImageView) rootView.findViewById(R.id.my_image);
        return rootView
}

Auf diese Weise kann das rootView für jedes im XML-Layout definierte Steuerelement verwendet werden, und der Code wird auf diese Weise viel sauberer.

Hoffe das hilft :)

5

Verwenden Sie gradle skeleton plugin , es generiert automatisch die View-Holder-Klassen mit dem Verweis auf Ihr Layout.

public class TestClass extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        MyLayout myLayout = new MyLayout(inflater, container, false);
        myLayout.myImage.setImageResource(R.drawable.myImage);
        return myLayout.view;
    }
}

Wenn Sie nun eine ImageView in Ihrer my_layout.xml-Datei deklariert haben, wird automatisch die myLayout-Klasse für Sie generiert.

4
Ilya Gazman

Innerhalb der Klasse FragmentNAME _ erhalten Sie die Überschreibungsmethode onViewCreated(), bei der Sie Ihre Ansichten immer initialisieren sollten, da bei dieser Methode das Objekt viewNAME _ verwendet wird, mit dem Sie Ihre Ansichten wie finden können :

class MyFragment extends Fragment {
    private ImageView imageView;

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

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) 
        super.onViewCreated(view, savedInstanceState);

        //initialize your view here for use view.findViewById("your view id")
        imageView = (ImageView) view.findViewById(R.id.my_image);
    }
}
4
Vipul Prajapati

Versuche dies:

View v = inflater.inflate(R.layout.testclassfragment, container, false);
ImageView img = (ImageView) v.findViewById(R.id.my_image);

return v;
4
AbhayBohra

Sie können findViewById() mit dem Activity Object aufrufen Sie gelangen in Ihre public void onAttach(Activity activity)-Methode in Ihr Fragment.

Speichern Sie die Aktivität beispielsweise in einer Variablen:

In der Fragment-Klasse : private Activity mainActivity;.__In der onAttach()-Methode: this.mainActivity=activity;

Führen Sie abschließend jede findViewById über das vairable aus: mainActivity.findViewById(R.id.TextView);

3
mrSurprise

In der onCreateView-Methode

1) Zuerst müssen Sie das Layout/die Ansicht, die Sie hinzufügen möchten, aufblaseneg. LinearLayout

LinearLayout ll = inflater.inflate(R.layout.testclassfragment, container, false);

2) Dann können Sie Ihre imageView-ID über das Layout finden

ImageView imageView = (ImageView)ll.findViewById(R.id.my_image);

3) das aufgeblasene Layout zurücksenden

return ll;
2

Layout Inflater kommt hier ins Bild. Layout Inflater ist eine Klasse, die es uns ermöglicht, XML-Ansichten in Java-Code zu verwenden. So können Sie die XML-Stammansicht in Variable v mit folgendem Code aufblasen. Und dann können Sie mit v die untergeordneten Ansichten der Stammansicht v finden.

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;
    }
}
2
Wijay Sharma

Sie müssen die Ansicht aufblasen

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
}}
1
Surajit Mondal

In Fragmenten benötigen wir eine Ansicht dieses Fensters, um aus diesem Fragment eine onCreateView zu erstellen. 

Rufen Sie dann die Ansicht auf und verwenden Sie sie, um auf jede Ansichts-ID dieser Ansichtselemente zuzugreifen.

  class Demo extends Fragment
    {
        @Override
        public View onCreateView(final LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState)
        {
            View view =inflater.inflate(R.layout.demo_fragment, container,false);
            ImageView imageview=(ImageView)view.findViewById(R.id.imageview1);

            return view;
        }
    }
0
Mayank Garg

Der einfachste Weg, solche Dinge zu verwenden, ist die Verwendung von butterknife Dadurch können Sie beliebig viele Onclciklistener von @OnClick () hinzufügen.

public class TestClass extends Fragment {
    @BindView(R.id.my_image) ImageView imageView;
    @OnClick(R.id.my_image)
    public void my_image_click(){
        yourMethod();
    }
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.testclassfragment, container, false);
        ButterKnife.bind(getActivity,view);
        return view;
    }
}
0
Amit

getView() funktioniert nur nachdem onCreateView() abgeschlossen ist, rufen Sie es also von onPostCreate() auf:

@Override
public void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    ImageView imageView = (ImageView) getView().findViewById(R.id.foo);
}
0
SwiftArchitect
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;
}

Beachten Sie, wenn Sie die getView()-Methode verwenden, kann dies nullPointerException verursachen, da es den rootview zurückgibt und es eine Ansicht nach der onCreateView()-Methode ist.

0
Mahdi-Malv