Pertanyaan findViewById di Fragmen


Saya mencoba membuat ImageView dalam Fragmen yang akan merujuk ke elemen ImageView yang telah saya buat di XML untuk Fragmen. Namun, itu findViewById metode hanya berfungsi jika saya memperpanjang kelas Activity. Apakah ada pula yang bisa saya gunakan dalam Fragmen juga?

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);
    }
}

Itu findViewById metode memiliki kesalahan di atasnya yang menyatakan bahwa metode tidak terdefinisi.


842
2018-06-27 16:24


asal


Jawaban:


Menggunakan getView () atau parameter Tampilan dari menerapkan onViewCreated metode. Ini mengembalikan tampilan root untuk fragmen (Yang dikembalikan oleh onCreateView() metode). Dengan ini Anda bisa menelepon 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); 

Sebagai getView() hanya berfungsi setelah onCreateView(), kamu tidak bisa menggunakannya di dalam onCreate() atau onCreateView() metode dari fragmen.


1224
2018-06-27 16:34



Anda perlu meng-upgrade tampilan dan panggilan Fragmen findViewById() pada View itu kembali.

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



Dalam Fragment kelas yang akan Anda dapatkan onViewCreated () timpa metode di mana Anda harus selalu menginisialisasi pandangan Anda karena dalam metode ini Anda mendapatkan objek tampilan yang menggunakan mana Anda dapat menemukan tampilan seperti:

@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);
}

Selalu ingat dalam hal Fragment itu onViewCreated() metode tidak akan dipanggil secara otomatis jika Anda mengembalikan null atau super.onCreateView() dari onCreateView() metode. Ini akan dipanggil secara default jika terjadi ListFragment sebagai ListFragment kembali FrameLayout secara default.

Catatan: Anda bisa mendapatkan tampilan fragmen di mana saja di kelas dengan menggunakan getView() sekali onCreateView() telah berhasil dijalankan.  yaitu

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

115
2018-03-04 14:46



Saya menyadari ini adalah pertanyaan lama, tetapi jawaban yang berlaku meninggalkan sesuatu yang diinginkan.

Pertanyaannya tidak jelas apa yang dituntut dari imageView - apakah kita mengembalikannya sebagai tampilan, atau hanya menyimpan referensi untuk nanti?

Either way, jika ImageView berasal dari tata letak yang digelembungkan, cara yang benar untuk melakukan ini adalah:

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



Dapatkan dulu tampilan fragmen dan kemudian dapatkan dari tampilan ini, ImageView Anda.

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



Anda juga bisa melakukannya di onActivityCreated Metode.

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

Seperti yang mereka lakukan di sini: http://developer.android.com/reference/android/app/Fragment.html  (tidak digunakan lagi di API level 28)

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

dan

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

itu mungkin.


19
2017-10-09 23:22



getView() akan memberikan tampilan root

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

18
2017-09-03 12:41



Anda dapat menimpa onViewCreated () yang disebut tepat setelah semua tampilan dipompa. Ini tempat yang tepat untuk mengisi anggota Fragment Anda View variabel. Inilah contohnya:

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



Metode getView () tidak akan bekerja pada fragmen di luar OnCreate dan metode serupa.

Anda memiliki dua cara, meneruskan pandangan ke fungsi pada oncreate (apa artinya Anda hanya dapat menjalankan fungsi Anda saat tampilan dibuat) atau mengatur tampilan sebagai variabel:

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