Ini adalah pertanyaan kanonik untuk masalah yang sering diposting di StackOverflow.
Saya mengikuti tutorial. Saya telah membuat aktivitas baru menggunakan wizard. Saya dapatkan NullPointerException
ketika mencoba memanggil metode yang View
diperoleh dengan findViewById()
dalam aktivitas saya onCreate()
.
Aktivitas onCreate()
:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View something = findViewById(R.id.something);
something.setOnClickListener(new View.OnClickListener() { ... }); // NPE HERE
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
}
Tata Letak XML ( fragment_main.xml
):
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="packagename.MainActivity$PlaceholderFragment" >
<View
android:layout_width="100dp"
android:layout_height="100dp"
android:id="@+id/something" />
</RelativeLayout>
findViewById()
dirootView
dan bukan pada aktivitas.Coba
OnStart()
metode dan gunakan sajaatau Deklarasikan Tampilan apa pun menggunakan
getView().findViewById
metode dalamonStart()
Deklarasikan pemroses klik pada tampilan oleh
anyView.setOnClickListener(this);
sumber
Cobalah untuk menggeser tampilan pengaksesan Anda ke metode onViewCreated dari fragmen karena terkadang saat Anda mencoba mengakses tampilan dalam metode onCreate, tampilan tersebut tidak dirender pada saat menghasilkan pengecualian pointer nol.
sumber
Setuju, ini adalah kesalahan umum karena orang sering tidak benar-benar memahami cara kerja Fragmen saat mereka mulai mengerjakan pengembangan Android. Untuk mengurangi kebingungan, saya membuat kode contoh sederhana yang awalnya saya posting di Aplikasi dihentikan di emulator android , tetapi saya mempostingnya di sini juga.
Contohnya adalah sebagai berikut:
activity_container.xml:
ExampleFragment:
fragment_example.xml:
Dan itu harus menjadi contoh yang valid, ini menunjukkan bagaimana Anda bisa menggunakan Aktivitas untuk menampilkan Fragmen, dan menangani kejadian di Fragmen itu. Dan juga bagaimana berkomunikasi dengan Activity yang ada di dalamnya.
sumber
Otto
untuk komunikasi, bukan callback, dan gunakanButterknife
untuk memasukkan tampilan.Tampilan "sesuatu" ada dalam fragmen dan bukan dalam aktivitas, jadi alih-alih mengaksesnya dalam aktivitas, Anda harus mengaksesnya di kelas fragmen seperti
Di PlaceholderFragment.class
sumber
Anda mencoba mengakses elemen UI di
onCreate()
tetapi, terlalu dini untuk mengaksesnya, karena dalam tampilan fragmen dapat dibuat dalamonCreateView()
metode. DanonActivityCreated()
metode ini dapat diandalkan untuk menangani tindakan apa pun padanya, karena aktivitas dimuat penuh dalam status ini.sumber
Tambahkan yang berikut ini di activity_main.xml Anda
sumber
Karena Anda telah mendeklarasikan View Anda di
fragment_main.xml
, pindahkan potongan kode tersebut di mana Anda mendapatkan NPE dalamonCreateView()
metode fragmen. Ini harus menyelesaikan masalah.sumber
dalam kode yang diposting di atas pada pertanyaan ada masalah: Anda menggunakan R.layout.activity_main dalam metode oncreate, tetapi nama file xml adalah "fragment_main.xml", berarti Anda mencoba untuk mendapatkan tampilan file fragment_main.xml yang tidak ditampilkan sehingga memberikan pengecualian pointer nol. ubah kodenya seperti:
sumber
Anda harus ingat hal penting adalah: NullPointerException terjadi ketika Anda telah mendeklarasikan variabel Anda dan mencoba mengambil nilainya sebelum memberikan nilai padanya.
sumber
Gunakan Metode onViewCreated () setiap kali menggunakan atau memanggil tampilan dari fragmen.
sumber
Saya mendapat
NullPointerException
inisialisasi pendengar yang sama setelah memanggilfindViewById()
onCreate()
danonCreateView()
metode.Tapi ketika saya menggunakannya,
onActivityCreated(Bundle savedInstanceState) {...}
itu berhasil. Jadi, saya bisa mengaksesGroupView
dan mengatur pendengar saya.Semoga bermanfaat.
sumber
Perpustakaan paling populer untuk menemukan tampilan yang digunakan oleh hampir setiap pengembang.
Pisau mentega
Yang saya bisa adalah jawaban mereka yang cukup menjelaskan menemukan pandangan dengan metodologi yang tepat. Tetapi jika Anda adalah pengembang Android dan sering membuat kode setiap hari, maka Anda dapat menggunakan pisau mentega yang menghemat banyak waktu dalam menemukan tampilan dan Anda tidak perlu menulis kode untuk itu, Dengan dalam 2-3 langkah Anda dapat menemukan tampilan dalam milidetik .
Tambahkan ketergantungan di tingkat aplikasi gradle:
Tambahkan plugin untuk pisau mentega:
Kemudian cari Android ButterKnife Zelezny dan instal plugin dan mulai ulang studio Anda dan selesai.
Sekarang masuk saja ke metode Oncreate aktivitas Anda dan klik kanan pada layout_name Anda dan ketuk tombol generate dan pilih opsi injeksi butterknife dan referensi tampilan Anda akan secara otomatis dibuat seperti yang disebutkan di bawah ini:
sumber