Saya mencoba membuat ImageView dalam Fragmen yang akan merujuk pada elemen ImageView yang telah saya buat dalam XML untuk Fragmen. Namun, findViewById
metode ini hanya berfungsi jika saya memperpanjang kelas Activity. Apakah ada yang bisa saya gunakan di Fragment 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);
}
}
The findViewById
metode memiliki kesalahan di atasnya yang menyatakan bahwa metode ini tidak terdefinisi.
android
android-fragments
android-imageview
findviewbyid
disederhanakan.
sumber
sumber
Jawaban:
Gunakan getView () atau parameter View dari penerapan
onViewCreated
metode. Ini mengembalikan tampilan root untuk fragmen (yang dikembalikan denganonCreateView()
metode) . Dengan ini, Anda dapat meneleponfindViewById()
.Sebagai
getView()
hanya berfungsi setelahonCreateView()
, Anda tidak dapat menggunakannya di dalamonCreate()
atauonCreateView()
metode fragmen.sumber
ImageView
berasal dari tata letak yang meningkat - lihat jawaban saya untuk detailnya. Kalau tidak, onCreateView adalah tempat yang tepat untuk melakukan ini @ N-AccessDevonActivityCreated()
adalah tempat yang direkomendasikan untuk menemukan dan menyimpan referensi ke pandangan Anda. Anda harus membersihkan ini referensi disimpan dengan menetapkan mereka kembali kenull
dalamonDestroyView()
atau Anda akan membocorkanActivity
.Anda perlu untuk mengembang melihat dan panggilan Fragmen ini
findViewById()
padaView
itu kembali.sumber
NullPointerException
.Di dalam
Fragment
kelas Anda akan mendapatkan metode override onViewCreated () di mana Anda harus selalu menginisialisasi pandangan Anda karena dalam metode ini Anda mendapatkan objek tampilan menggunakan yang dapat Anda temukan seperti:Selalu ingat dalam kasus Fragmen bahwa
onViewCreated()
metode tidak akan dipanggil secara otomatis jika Anda mengembalikan nol atausuper.onCreateView()
darionCreateView()
metode. Ini akan dipanggil secara default dalam kasusListFragment
sepertiListFragment
pengembalianFrameLayout
secara default.Catatan: Anda bisa mendapatkan tampilan fragmen di mana saja di kelas dengan menggunakan
getView()
setelahonCreateView()
berhasil dieksekusi. yaitusumber
view
diteruskan keonViewCreated
masih menyebabkanNullPointerException
tetapi menggunakangetActivity()
tidak masalah. Ada ide mengapa?onCreateView
metode. Saya baru saja debug dan ternyata ada tata letak (dalam kasus sayaFrameLayout
). Itu dikatakan ketika saya mencoba untuk menemukan elemen yang dikembalikannull
. Mengapa ini terjadi?Saya menyadari ini adalah pertanyaan lama, tetapi jawaban yang ada meninggalkan sesuatu yang diinginkan.
Pertanyaannya tidak jelas apa yang diperlukan
imageView
- apakah kita meneruskannya sebagai pandangan, atau hanya menyimpan referensi untuk nanti?Either way, jika
ImageView
berasal dari tata letak yang meningkat, cara yang benar untuk melakukan ini adalah:sumber
Dapatkan dulu tampilan fragmen dan kemudian dapatkan dari tampilan ini ImageView Anda.
sumber
Anda juga bisa melakukannya di
onActivityCreated
Metode.Seperti yang mereka lakukan di sini: http://developer.android.com/reference/android/app/Fragment.html (tidak digunakan lagi di API level 28)
dan
mungkin.
sumber
getView()
akan memberikan tampilan rootsumber
Anda dapat mengganti onViewCreated () yang dipanggil tepat setelah semua tampilan telah meningkat. Ini adalah tempat yang tepat untuk mengisi
View
variabel anggota Fragment Anda . Ini sebuah contoh:sumber
Di dalam
Fragment
kelas kita mendapatkanonViewCreated()
metode override di mana kita harus selalu menginisialisasi pandangan kita karena dalam metode ini kita mendapatkanview
objek. Menggunakan objek ini kita dapat menemukan pandangan kita seperti di bawah ini:sumber
Metode getView () tidak akan bekerja pada fragmen di luar OnCreate dan metode serupa.
Anda memiliki dua cara, meneruskan tampilan ke fungsi pada oncreate (apa artinya Anda hanya dapat menjalankan fungsi saat tampilan sedang dibuat) atau mengatur tampilan sebagai variabel:
sumber
1) pertama kali mengembang layout Fragment maka Anda dapat menggunakan findviewbyId.
sumber
sumber
Menggunakan
ini akan bekerja
sumber
setuju dengan memanggil
findViewById()
View.sumber
Catatan :
Dari API Level 26, Anda juga tidak perlu secara khusus menampilkan hasil findViewById karena menggunakan inferensi untuk tipe pengembaliannya.
Jadi sekarang Anda bisa melakukannya,
sumber
Menurut dokumentasi pada API level 11
Referensi, di Back Stack http://developer.android.com/reference/android/app/Fragment.html
Kode pendek
sumber
Menggunakan
getView()
mengembalikan tampilan fragmen, maka Anda dapat memanggilfindViewById()
untuk mengakses elemen tampilan apa pun di tampilan fragmen.sumber
Coba ini bekerja untuk saya
sumber
Cara terbaik untuk mengimplementasikan ini adalah sebagai berikut:
Dengan cara ini, rootView dapat digunakan untuk setiap kontrol yang ditentukan dalam tata letak xml dan kode jauh lebih bersih dengan cara ini.
Semoga ini membantu :)
sumber
1) Nyatakan file tata letak Anda.
2) Lalu, dapatkan id dari pandangan Anda
sumber
Gunakan plugin gradle skeleton , itu akan secara otomatis menghasilkan kelas pemegang pandangan dengan referensi tata letak Anda.
Sekarang dengan asumsi Anda telah
ImageView
mendeklarasikan dalammy_layout.xml
file Anda , itu akan secara otomatis menghasilkan kelas myLayout untuk Anda.sumber
Coba ini:
sumber
mencoba
sumber
getView()
nantiAnda dapat menelepon
findViewById()
dengan Objek Aktivitas yang Anda dapatkan di dalampublic void onAttach(Activity activity)
metode Anda di dalam Fragmen Anda.Simpan Aktivitas ke dalam variabel misalnya:
Di kelas Fragmen :
private Activity mainActivity;
DalamonAttach()
metode:this.mainActivity=activity;
Terakhir, jalankan setiap findViewById melalui vairable:
mainActivity.findViewById(R.id.TextView);
sumber
Ada satu metode lagi yang disebut onViewCreated.
sumber
Di dalam metode onCreateView
1) pertama Anda harus mengembang tata letak / tampilan yang ingin Anda tambahkan misalnya. LinearLayout
2) Kemudian Anda dapat menemukan id imageView Anda dari tata letak
3) mengembalikan tata letak yang meningkat
sumber
Anda harus mengembang tampilan
sumber
Dalam fragmen, kita memerlukan tampilan jendela itu sehingga kita membuat onCreateView dari fragmen ini.
Kemudian dapatkan tampilan dan gunakan untuk mengakses setiap id tampilan dari elemen tampilan tersebut.
sumber
Layout inflater ditampilkan di sini. Layout inflater adalah kelas yang membuat kita dapat menggunakan tampilan XML dalam kode java. Jadi Anda bisa mengembang tampilan root xml dalam variabel v dengan kode berikut. Dan kemudian menggunakan v, Anda dapat menemukan tampilan anak dari tampilan root v.
sumber
Cara termudah untuk menggunakan hal-hal seperti itu adalah dengan menggunakan butterknife. Dengan ini Anda dapat menambahkan sebanyak mungkin Onclciklisteners hanya dengan @OnClick () seperti yang dijelaskan di bawah ini:
sumber