Saya memiliki res/layout/main.xml
termasuk elemen ini dan lainnya:
<some.package.MyCustomView android:id="@+id/foo" (some other params) />
<TextView android:id="@+id/boring" (some other params) />
Di onCreate Aktivitas saya, saya melakukan ini:
setContentView(R.layout.main);
TextView boring = (TextView) findViewById(R.id.boring);
// ...find other elements...
MyCustomView foo = (MyCustomView) findViewById(R.id.foo);
if (foo == null) { Log.d(TAG, "epic fail"); }
Unsur-unsur lain berhasil ditemukan, tetapi foo
kembali nol. MyCustomView memiliki konstruktor MyCustomView(Context c, AttributeSet a)
dan Log.d(...)
di akhir konstruktor tersebut berhasil muncul di logcat tepat sebelum "epik gagal".
Mengapa foo
null?
(MyCustomView) foo = findViewById(R.id.foo);
ituMyCustomView foo = (MyCustomView) findViewById(R.id.foo);
?Saya memiliki masalah yang sama karena dalam tampilan kustom saya, saya mengganti konstruktor tetapi memanggil super contrs dengan paramete attrs. Itu adalah copy paste)
Versi konstruktor saya sebelumnya:
Sekarang saya punya:
Dan itu berhasil!
sumber
Saya memiliki masalah yang sama. Kesalahan saya adalah: Saya menulis
dan karena saya menggunakan inflater untuk "memuat" tampilan dari file XML, baris terakhir salah. Untuk mengatasinya, saya harus menulis:
Saya menulis solusi saya, jika seseorang memiliki masalah yang sama.
sumber
Sepertinya ada berbagai alasan. Saya baru saja menggunakan "Bersihkan ..." di Eclipse untuk memecahkan masalah serupa. (FindViewByID telah bekerja sebelumnya dan karena alasan tertentu mulai mengembalikan null.)
sumber
Masalah yang sama, tetapi solusi yang berbeda: Saya tidak menelepon
SEBELUM saya mencoba mencari pemandangan seperti yang tertera di sini
sumber
Jika Anda memiliki beberapa versi tata letak (bergantung pada kepadatan layar, versi SDK), pastikan semuanya menyertakan elemen yang Anda cari.
sumber
Dalam kasus saya findViewById mengembalikan null karena tampilan kustom saya terlihat seperti ini di XML utama:
<com.gerfmarquez.seekbar.VerticalSeekBar android:id="@+id/verticalSeekBar" android:layout_width="wrap_content" android:layout_height="fill_parent" />
dan saya menemukan bahwa ketika saya menambahkan hal-hal xmlns itu bekerja seperti ini:
<com.gerfmarquez.seekbar.VerticalSeekBar xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/verticalSeekBar" android:layout_width="wrap_content" android:layout_height="fill_parent" />
sumber
Pastikan bahwa
setContentView(R.layout.main)
pernyataan memanggil sebelumfindViewById(...)
pernyataan;sumber
Bagi saya, masalah terpecahkan ketika saya menambahkan folder res ke Source di Java Build Path di Project Settings.
sumber
Saya mengalami masalah yang sama beberapa waktu yang lalu ketika saya menambahkan Tampilan kustom melalui XML tata letak dan kemudian mencoba memasang callback di tempat lain dalam aplikasi ...
Saya membuat tampilan kustom dan menambahkannya ke "layout_main.xml" saya
Dan di Aktivitas utama saya ingin melampirkan beberapa callback dan mendapatkan referensi ke elemen UI dari XML.
Initilizer tidak melakukan sesuatu yang mewah tetapi perubahan apa pun yang dicoba dilakukan pada tampilan kustom (MUIComponent) atau elemen UI non-kustom lainnya tidak muncul dalam aplikasi.
Perbedaan antara "badInst" dan "goodInst" adalah:
sumber
Ini terjadi pada saya dengan komponen khusus untuk Wear, tetapi merupakan saran umum. Jika Anda menggunakan Stub (seperti yang saya gunakan
WatchViewStub
), Anda tidak bisa begitu saja menelepon kefindViewById()
mana pun. Segala sesuatu di dalam rintisan harus digelembungkan terlebih dahulu, yang tidak terjadi begitu sajasetContentView()
. Jadi, Anda harus menulis sesuatu seperti ini untuk menunggu itu terjadi:sumber
Masalah saya adalah salah ketik. Saya telah menulis
android.id
(titik), bukanandroid:id
. : PRupanya tidak ada pemeriksaan sintaks dalam komponen kustom saya xml. :(
sumber
Punya masalah yang sama.
Saya memiliki tata letak dengan sedikit anak. Dari konstruktor salah satunya saya mencoba mendapatkan referensi (dengan menggunakan context.findViewById) ke anak lain. Itu tidak berfungsi karena anak kedua didefinisikan lebih jauh dalam tata letak.
Saya telah menyelesaikannya seperti ini:
Ini akan berhasil juga jika urutan anak-anak berlawanan, tapi saya rasa umumnya harus dilakukan seperti di atas.
sumber
findViewById
dalam konstruktor aView
, melainkan meletakkan kode inisialisasi diOnFinishInflate
?The
findViewById()
Metode kadang-kadang kembalinull
ketika akar tata letak tidak memilikiandroid:id
atribut. Wizard Eclipse untuk membuat file xml layout tidak secara otomatis menghasilkanandroid:id
atribut untuk elemen root.sumber
Dalam kasus saya, tampilan berada di induk BUKAN dalam tampilan yang saya coba panggil. Jadi dalam tampilan anak saya harus memanggil:
sumber
Opsi 'bersih' berhasil untuk saya.
Dalam kasus saya, akar penyebabnya adalah bahwa kode sumber berada di jaringan bersama, dan workstation serta server file saya tidak disinkronkan dengan benar, dan telah melayang selama 5 detik. Stempel waktu pada file yang dibuat oleh Eclipse berada di masa lalu (karena mereka ditetapkan oleh server file) membuat jam stasiun kerja, menyebabkan Eclipse menyelesaikan dependensi antara file yang dibuat dan file sumber secara tidak benar. Dalam kasus ini, 'clean' tampaknya berfungsi, karena memaksa build ulang lengkap, bukan build inkremental yang bergantung pada stempel waktu yang salah.
Setelah saya memperbaiki pengaturan NTP di workstation saya, masalah tidak pernah terjadi lagi. Tanpa pengaturan NTP yang tepat, itu akan terjadi setiap beberapa jam, karena jam bergerak cepat.
sumber
Untuk menambahkan kesalahan sepele lainnya ke jawaban yang harus diperhatikan:
Periksa apakah Anda benar-benar mengedit file XML tata letak yang benar ...
sumber
saya memiliki masalah yang sama karena saya lupa memperbarui id tampilan di semua folder tata letak saya.
sumber