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?

Lukap
sumber

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).

kaspermoerch
sumber
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);
Davide
sumber
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)

Prakash Nadar
sumber
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);
anujprashar
sumber
1
LayoutInflater.from(context).inflate(R.layout.row_payment_gateway_item, null);
Sikander Bakht
sumber
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!

Brian Tompsett - 汤 莱恩
sumber