Görünümü AlertDialog tarafından kullanılmak üzere şişirirken "görünüm kökü olarak boş geçmekten kaçının" uyarısı


126

Avoid passing null as the view rootGörünümleri aşağıdaki nullgibi şişirirken tüy bırakma uyarısı alıyorum parent:

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

Bununla birlikte, görünüm, on AlertDialogkullanılarak bir içeriği olarak kullanılacak , bu yüzden .setViewAlertDialog.Builderparent

parentBu durumda ne olması gerektiğini düşünüyorsunuz ?


2
Null yerine false değerini iletin. bkz bu
MrDumb

Size null yerine ebeveyn düzeni vermeye çalışın ve sonra setView kullanmayın.
Haresh Chhelana

Yöntem için tüy bırakma uyarısını bastırıyorum. Henüz geçmemem için iyi bir neden görmedim null.
323go

4
Ana görünüme bağlı olarak düzen sorununu anlıyorum, ancak bu aslında Aktivitenin görünüm hiyerarşisinin üzerinde kayan bir AlertDialog için geçerli değil. Bu yüzden geçebilirsin null. Tüy bırakmanın bir sebebi var. Lint'in size sık sık gözden kaçan sorunlar için uyarılar vermesi beklenir; bu durumda, bu doğru çağrıdır.
323go

1
@ ashutiwari4 Her gün yeni şeyler öğreniyorum .. güzel dünya: I
Rahul

Yanıtlar:


175

Bu kodu, iletişim kutusu görünümünü herhangi bir uyarı olmadan şişirmek için kullanın:

View.inflate(context, R.layout.dialog_edit, null);

7
@ MarianPaździoch Çünkü bir uyarıya neden olmaz. :-) Tabii ki, tiftik kodu davranır neden olduğu dilenir soru View.inflateve LayoutInflator.inflatefarklı. Kesin bir cevap görmedim. Neden aynı görüşü şişirmek için görünüşte eşdeğer iki yol olduğu ile ilgili olabilir, bunun için bir mantık da görmedim.
Edward Brey

12
Bu yanlış. Yalnızca uyarıyı bastırır, ancak sorun hala oradadır. Daha iyi bir çözüm için possiblemobile.com/2013/05/layout-inflation-as-intended'i okuyun .
jcsahnwaldt Monica'yı eski haline getir

16
@JonaChristopherSahnwaldt Biraz daha detaylandırır mısınız? Makale, AlertDialog'un bir kök görünümü olmadığı için boş bir ebeveyni olması gerektiğini söylüyor. Bana göre, uyarının bir iletişim kutusu dışındaki görünümler için anlamlı olduğunu, ancak bir iletişim görünümü için geçerli olmadığını pekiştiriyor gibi görünüyor.
Edward Brey

7
@EdwardBrey Haklısınız - makaleyi tam olarak okumadım. Bu özel durumda, View.inflate(...null)veya kullanmakta sorun yoktur @SuppressLint. Genel LayoutInflater.from(...).inflate(..., parent, false)olarak daha iyidir. Bunu işaret ettiğiniz için teşekkürler!
jcsahnwaldt Monica'yı eski haline getir

1
@Bevor That Önleme boş soru, ebeveyninizin olduğu durumlarla ilgilidir. Bu soru, AlertDialogşişirilmiş görünüm için hiçbir ebeveyn sağlamayan hakkındadır. Bir'in kök görünümünü şişirirken, AlertDialogboş geçmek doğrudur. Lint, bu özel bağlamı hesaba katmaz, bu nedenle parenthatalı pozitif alan işlevi kullanırsanız, hataya eğilimli herhangi bir şeyin göstergesi değildir. Bu nedenle, bu durumda hayır almayan parentve uyarı vermeyen işlevi kullanmak geçerlidir .
Edward Brey

35

Kısa hikaye, bir diyalog için bir görünümü şişirirken parent, View inflation time'da bilinmediği için boş olması gerektiğidir. Bu durumda, uyarıyı önlemek için üç temel çözümünüz vardır:

  1. @Suppress kullanarak uyarıyı bastırın
  2. View'un şişirme yöntemini kullanarak Görünümü şişirin . Bu, bir LayoutInflater'ın etrafındaki bir sarmalayıcıdır ve çoğunlukla sorunu sadece karmaşık hale getirir.
  3. LayoutInflater en kullanarak Görünüm şişirin tam yöntem : inflate(int resource, ViewGroup root, boolean attachToRoot). Set attachToRootiçin false.Bu ebeveyn mevcut olmadığını Inflater söyler. Android Lint'in eski sürümlerinde bu, uyarıyı kaldırdı. Bu artık Android Studio'nun 1.0 sonrası sürümlerinde geçerli değildir.

Check out http://www.doubleencore.com/2013/05/layout-inflation-as-intended/ , bu konuda büyük bir tartışma için sonunda özel olarak "Her Kural bir özel durum Has" bölümü.


19

ViewGroup olarak null değer atıldığında uyarı çözüldü:

View dialogView = li.inflate(R.layout.input_layout,(ViewGroup)null);

burada libir LayoutInflater'snesne.


burada 'li' LayoutInflater nesnesidir.
SVL Narasimham

3
Bu cevap en iyisidir ve bunu gerçekte NEDEN yaptığınızı anlamanız koşuluyla. Kısa hikaye, daha önce de okumuş olabileceğiniz gibi, AlertDialog'un ebeveynini şişirme zamanında tanımadığı ve bu nedenle, siz gerçekten doğru şeyi yaptığınızda, bu kesin durumda bir uyarı atmasının bir yan etkisidir.
Mar Bar

Bu uyarı hakkında sayısız cevap ve sayfa okudum, ancak çözümünüz açık ara en iyisi: basit ve zarif
Couitchy

9
Ama bu gereksiz döküm
mohit

11
Sonra başka bir "Yayın gereksizdir" uyarısı alıyoruz!
Mousa

17

Kullanmalısınız AlertDialog.Builder.setView(your_layout_id), böylece şişirmenize gerek kalmaz.

AlertDialog.findViewById(your_view_id)İletişim kutusunu oluşturduktan sonra kullanın .

Ve sonra içine (AlertDialog) dialogInterfacegirmek için kullanın .dialogOnClickListenerdialog.findViewById(your_view_id)


1
Gitmenin yolu bu! Sadece diyaloğu oluşturun ve ardından görünümünüzü bulun.
user1806772

1
Bu, bunu yapmanın iyi bir yoludur, ancak bu yöntemin API 21
Nicolás Carrasco

Ya bu şişirilmiş düzeni bazı değişkenlerde saklamamız gerekirse? Örneğin A, metodun olduğu bir sınıf yazdım onCreateDialog. İkincisinde, ou'nun dediğini yazdım alert_dialog_builder.setView(R.layout.edit_account_dialog);. Ama bu şişirilmiş düzeni Aadlı 's öznitelik değişkeninde saklamalıyım the_inflated_layout_of_the_dialog.
JarsOfJam-Scheduler

9

parentBir iletişim kutusu için bir belirtmenize gerek yoktur .

Bunu @SuppressLint("InflateParams")geçersiz kılmanın en üstünde kullanarak bastırın.


7

Gerçekten hiç sahip olmadığınızda parent(örneğin için görünüm oluşturmak AlertDialog), geçmek dışında başka seçeneğiniz yoktur null. Bu yüzden uyarıdan kaçınmak için şunu yapın:

final ViewGroup nullParent = null;
convertView = infalInflater.inflate(R.layout.list_item, nullParent);

4
Başka bir uyarı "nullParent 'değeri her zaman boştur."
mallaudin

AndroidStudio 3.3 ve API 28'den itibaren, işlerle ilgili tek çözüm budur.
zeeshan

1
  1. AlertDialog, bildiğim kadarıyla tek durum , bir ana görünüm yerine güvenli bir şekilde null kullanabilmenizdi . Bu durumda, aşağıdakileri kullanarak uyarıyı bastırabilirsiniz:

    @SuppressLint ( "InflateParams")

  2. Genel olarak, uyarıdan kurtulmak için hiçbir zaman SupressLint'i veya diğer yanıtlarda belirtilen geçici çözümlerden birini kullanmamalısınız. Üst görünüm, şişirilmekte olan Görünümün kök öğesinde bildirilen Düzen Parametrelerini değerlendirmek için gereklidir. Bu , üst görünüm yerine null kullanırsanız, kök öğedeki tüm Düzen Parametreleri yok sayılacak ve varsayılan Düzen Parametreleri ile değiştirilecektir. Çoğu zaman sorun olmaz, ancak bazı durumlarda bulunması gerçekten zor bir hataya neden olur.


0

Belgelerinden View.inflate()diyor ki

Bir XML kaynağından bir görünümü şişirin. Bu kolaylık yöntemi LayoutInflater, görünümü şişirmek için tam bir seçenek yelpazesi sunan sınıfı sarar .

  @param context The Context object for your activity or application.
  @param resource The resource ID to inflate
  @param root A view group that will be the parent.  Used to properly inflate the  layout_* parameters.

0

Https://developer.android.com/guide/topics/ui/dialogs'a göre

Diyalog için mizanpajı şişirin ve ayarlayın. Diyalog mizanpajına girdiği
için üst görünüm olarak null geçirin

bu nedenle, AlertDialog oluşturmak için kullanıyorum @SuppressLint("InflateParams")

LayoutInflater inflater = requireActivity().getLayoutInflater();
@SuppressLint("InflateParams")
View view = inflater.inflate(R.layout.layout_dialog, null);
builder.setView(view);

-1

Yapmak yerine

view = inflater.inflate(R.layout.list_item, null);

yapmak

view = inflater.inflate(R.layout.list_item, parent, false);

Onu verilen ebeveynle şişirecek, ancak ebeveyne eklemeyecektir.

Coeffect'e çok teşekkürler (gönderisine bağlantı )


Nasıl ebeveyn olunacağını bilmek de faydalı olacaktır.
Johan Karlsson
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.