Panggil ke getLayoutInflater () di tempat yang tidak ada aktivitas


190

Apa yang perlu diimpor atau bagaimana saya dapat memanggil inflater Layout di tempat lain selain aktivitas?

public static void method(Context context){
    //this doesn't work the getLayoutInflater method could not be found
    LayoutInflater inflater = getLayoutInflater();
    // this also doesn't work 
    LayoutInflater inflater = context.getLayoutInflater();
}

Saya hanya bisa menelepon getLayoutInflaterdalam aktivitas, apakah itu batasan? Bagaimana jika saya ingin membuat dialog khusus dan saya ingin mengembang tampilan untuk itu, atau bagaimana jika saya ingin memiliki pesan Toast dengan tampilan kustom yang ditampilkan dari layanan, saya hanya memiliki konteks dari layanan saya tidak memiliki aktivitas apa pun tapi saya ingin menampilkan pesan khusus.

Saya membutuhkan inflater di tempat-tempat dalam kode yang tidak ada di kelas aktivitas.

Bagaimana saya bisa melakukan ini?

Jawaban:


396

Anda dapat menggunakan kegiatan di luar ini - yang Anda butuhkan adalah menyediakan Context:

LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );

Kemudian untuk mengambil widget yang berbeda, Anda mengembang tata letak:

View view = inflater.inflate( R.layout.myNewInflatedLayout, null );
Button myButton = (Button) view.findViewById( R.id.myButton );

EDIT per Juli 2014

Jawaban Davide tentang cara mendapatkannya LayoutInflatersebenarnya lebih benar daripada milik saya (yang masih berlaku).


Bagus, Tapi sekarang findViewById tidak berfungsi, apakah Anda punya ide tentang itu? inflater.inflate (R.layout.some_layout, (ViewGroup) findViewById (R.id.parent));
Lukap

nop, inflater.inflate () method tidak memiliki metode kelebihan dengan hanya satu int param, tapi saya kira yang berikutnya bisa menjadi nol.
Lukap

@kaspermoerch mengapa Anda mengatakan jawaban David lebih benar?
Rohan Bhatia

1
@RohanBhatia Davides menjawab tidak membutuhkan casting yang tambangnya lakukan. Jika panggilan ke getSystemServicekarena beberapa (tidak mungkin) alasan tidak mengembalikan objek bertipe LayoutInflatermaka kode saya akan menyebabkan pengecualian runtime.
kaspermoerch

Bekerja untukku. Terima kasih
CodeFluid

261

Atau ...

LayoutInflater inflater = LayoutInflater.from(context);

5
Sangat terlambat, tetapi sebenarnya jawaban yang lebih baik karena dari fungsi juga memeriksa dengan menyatakan bahwa Anda benar-benar mendapatkan inflater kembali dan melemparkan kesalahan sebaliknya - yang akan jauh lebih mudah untuk berurusan dengan kemudian pengecualian pointer nol di suatu tempat dalam kode. grepcode.com/file/repository.grepcode.com/java/ext/…
Raanan

38
Begitu singkat, jauh lebih menarik
Danyal Aytekin

@Davide Apakah kutipan ini berarti bahwa solusi kaspermoerch lebih baik daripada solusi Anda? "Ini tidak pernah digunakan secara langsung. Sebagai gantinya, gunakan getLayoutInflater () atau getSystemService (Class) untuk mengambil instance LayoutInflater standar yang sudah terhubung ke konteks saat ini dan dikonfigurasikan dengan benar untuk perangkat yang Anda jalankan." developer.android.com/reference/android/view/LayoutInflater
Tamás Bolvári

@ TamásBolvári Lebih mudah dan jelas, bahkan implementasi internalnya sama dengan penulisan Kaspermoerch.
Davide

11

atau

View.inflate(context, layout, parent)


Tidak apa-apa ; namun, dengan metode ini, saya tidak dapat memberikan "attachToRoot" boolean
DenisGL

Ini didasarkan pada persyaratan, jika Anda tidak perlu attachToRoot maka ini adalah metode pembantu yang mudah digunakan atau meneruskan getRootView () sebagai induk ke metode.
Prakash Nadar

9

Menggunakan objek konteks Anda bisa mendapatkan LayoutInflater dari kode berikut

LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

1
LayoutInflater.from(context).inflate(R.layout.row_payment_gateway_item, null);

1
Anda didorong untuk memberikan beberapa teks penjelasan beserta kode Anda.
HansHirse

1
LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );

Gunakan ini sebagai gantinya!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.