Etkinlik olmayan yerlerde getLayoutInflater () çağrısı


190

İçe aktarılması gereken şey nedir veya Etkinlik dışındaki yerlerde Düzen şişiricisini nasıl çağırabilirim?

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();
}

getLayoutInflaterSadece faaliyette arayabiliyorum , bu bir kısıtlama mı? Özel iletişim kutusu oluşturmak istiyorsam ve bunun için görünümü şişirmek istiyorsam veya bir hizmetten gösterilen özel görünüme sahip Tost iletisi almak istiyorsam, yalnızca herhangi bir etkinliğim olmayan hizmetten bağlamım var ancak özel mesaj göstermek istiyorum.

Ben aktivite sınıfta olmayan kod yerlerde yerlerde inflater gerekir.

Bunu nasıl yapabilirim ?

Yanıtlar:


396

Bu dış etkinlikleri kullanabilirsiniz - tek ihtiyacınız olan bir Context :

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

Ardından farklı widget'larınızı almak için bir düzen şişirirsiniz:

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

Temmuz 2014 itibarıyla DÜZENLEME

Davide'nın bunu nasıl alacağına dair cevabıLayoutInflater aslında benimkinden daha doğrudur (yine de geçerlidir).


Harika, Ama şimdi findViewById çalışmıyor, bununla ilgili bir fikrin var mı? inflater.inflate (R.layout.some_layout, (ViewGroup) findViewById (R.id.parent));
Lukap

nop, inflater.inflate () yönteminin yalnızca bir int parametresi ile aşırı yüklenmiş bir yöntemi yoktur, ancak sanırım bir sonraki yöntem boş olabilir.
Lukap

@kaspermoerch David'in cevabının neden daha doğru olduğunu söyledin?
Rohan Bhatia

1
@RohanBhatia Davides cevabı benimkinin dökümünü gerektirmez. getSystemServiceBazı (olası olmayan bir nedenle) çağrısı tür nesnesini döndürmezse, LayoutInflaterkodum bir çalışma zamanı istisnasına neden olur.
kaspermoerch

Benim için çalıştı. Teşekkürler
CodeFluid

261

Veya ...

LayoutInflater inflater = LayoutInflater.from(context);

5
Çok geç, ama aslında daha iyi bir cevap from işlevi aslında bir inflater geri almak ve aksi takdirde bir hata atar iddia ile denetler - bu kod ile bir yerde boş bir işaretçi excpetion başa çıkmak çok daha kolay olacaktır. grepcode.com/file/repository.grepcode.com/java/ext/…
Raanan

38
Çok kısa, çok daha şişman
Danyal Aytekin

@Davide Bu alıntı kaspermoerch'in çözümünün sizinkinden daha iyi olduğu anlamına mı geliyor? "Hiçbir zaman doğrudan kullanılmaz. Bunun yerine, geçerli bağlama bağlanmış ve üzerinde çalışmakta olduğunuz aygıt için doğru yapılandırılmış standart bir LayoutInflater örneğini almak için getLayoutInflater () veya getSystemService (Class) kullanın." developer.android.com/reference/android/view/LayoutInflater
Tamás Bolvári

@ TamásBolvári Sadece daha kolay ve açıktır, aslında dahili uygulama Kaspermoerch yazma ile aynıdır.
Davide

11

veya

View.inflate(context, layout, parent)


Bu iyi ; Ancak, bu yöntemle, boolean "attachToRoot"
sağlayamıyorum

AttachToRoot'a ihtiyacınız yoksa bu gereksinime dayanır, o zaman bu uygun bir yardımcı yöntemdir veya yöntemin üst öğesi olarak getRootView () iletin.
Prakash Nadar

9

Bağlam nesnesini kullanarak aşağıdaki koddan LayoutInflater alabilirsiniz

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

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

1
Kodunuzla birlikte bazı açıklayıcı metinler sağlamanız önerilir.
HansHirse

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

Bunun yerine bunu kullanın!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.