Reputation: 73375
I get the lint warning, Avoid passing null as the view root
when inflating views with null
as parent
, like:
LayoutInflater.from(context).inflate(R.layout.dialog_edit, null);
However, the view is to be used as the content of an AlertDialog
, using setView
on AlertDialog.Builder
, so I don't know what should be passed as the parent
.
What do you think the parent
should be in this case?
Upvotes: 144
Views: 52415
Reputation: 2290
Edit:
At the time of writing this answer, I was not aware of Lint suppressions. It's better to suppress Lint instead of tricking the IDE. Add this above the line or method:
@SuppressLint("InflateParams")
Old answer:
When you really don't have any parent
(for example creating view for AlertDialog
), you have no other choice than passing null
. So do this to avoid warning:
// Java
final ViewGroup nullParent = null;
convertView = infalInflater.inflate(R.layout.list_item, nullParent);
// Kotlin
val nullParent: ViewGroup? = null
val convertView = layoutInflater.inflate(R.layout.my_dialog, nullParent)
Upvotes: 8
Reputation: 83
Android's docs (AlertDialog) says:
If you want to display a more complex view, look up the FrameLayout called "custom" and add your view to it:
FrameLayout fl = findViewById(android.R.id.custom);
fl.addView(myView, new LayoutParams(MATCH_PARENT, WRAP_CONTENT));
Therefore, we can use fl
as parent in our case:
FrameLayout fl = findViewById(android.R.id.custom);
View view = LayoutInflater.from(context).inflate(R.layout.custom_dialog, fl, false);
It works, but I'm not sure that it's efficient or not
Upvotes: 0
Reputation: 439
According to https://developer.android.com/guide/topics/ui/dialogs
Inflate and set the layout for the dialog
Pass null as the parent view because its going in the dialog layout
therefore, for creating AlertDialog, I use @SuppressLint("InflateParams")
LayoutInflater inflater = requireActivity().getLayoutInflater();
@SuppressLint("InflateParams")
View view = inflater.inflate(R.layout.layout_dialog, null);
builder.setView(view);
Upvotes: 1
Reputation: 492
From the documentation of View.inflate()
, it says
Inflate a view from an XML resource. This convenience method wraps the
LayoutInflater
class, which provides a full range of options for view inflation.
@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.
Upvotes: -2
Reputation: 5846
The AlertDialog is as far as I know the only case were you can safely use null instead of a parent view. In this case you can suppress the warning by using:
@SuppressLint("InflateParams")
In general you should never use SupressLint or one of the workarounds mentioned in the other answers to get rid of the warning. The parent view is necessary to evaluate the Layout Params which are declared in the root element of the View being inflated. That means if you use null instead of the parent view, all Layout Params in the root element will be ignored and replaced by default Layout Params. Most of the time it will be fine, but in some cases it will result in a really hard-to-find bug.
Upvotes: 0
Reputation: 10044
You don't need to specify a parent
for a dialog.
Suppress this using @SuppressLint("InflateParams")
at the top of the override.
Upvotes: 11
Reputation: 223
Casting null as ViewGroup resolved the warning:
View dialogView = li.inflate(R.layout.input_layout,(ViewGroup)null);
where li
is the LayoutInflater's
object.
Upvotes: 19
Reputation: 1967
You should use AlertDialog.Builder.setView(your_layout_id)
, so you don't need to inflate it.
Use AlertDialog.findViewById(your_view_id)
after creating the dialog.
Use (AlertDialog) dialogInterface
to get the dialog
inside the OnClickListener
and then dialog.findViewById(your_view_id)
.
Upvotes: 22
Reputation: 747
Instead of doing
view = inflater.inflate(R.layout.list_item, null);
do
view = inflater.inflate(R.layout.list_item, parent, false);
It will inflate it with the given parent, but won't attach it to the parent.
Many thanks to Coeffect (link to his post)
Upvotes: -2
Reputation: 2386
The short story is that when you are inflating a view for a dialog, parent
should be null, since it is not known at View inflation time. In this case, you have three basic solutions to avoid the warning:
inflate(int resource, ViewGroup root, boolean attachToRoot)
. Set attachToRoot
to false
.This tells the inflater that the parent is not available.Check out http://www.doubleencore.com/2013/05/layout-inflation-as-intended/ for a great discussion of this issue, specifically the "Every Rule Has an Exception" section at the end.
Upvotes: 38
Reputation: 41648
Use this code to inflate the dialog view without a warning:
View.inflate(context, R.layout.dialog_edit, null);
Upvotes: 193