我有一个ImageView
我附加到MenuItem
ActionView
(该项目显示在ActionBar
中)。此视图的布局来自XML。我像这样膨胀它:
ImageView actionView = (ImageView) layoutInflater.inflate(
R.layout.action_view_layout, null);
这似乎工作正常。然而;在root
的调用中为inflate()
传递null会让Lint对我大喊:
避免将null作为视图根传递(需要解析布局 膨胀布局的根元素参数
在我的具体情况下,我似乎可以在没有root的情况下进行管理,但我希望代码尽可能正确。问题是,我不确定哪个View
应该用作根。 This answer表示它应该是围绕您想要膨胀的视图对象的小部件。"但这意味着什么呢?动作栏的那一个?活动?还有其他什么呢?
更新:阅读答案让我怀疑我正确的做法是:
ActionBar
View
MenuItem
ViewGroup
这似乎有效。任何人都可以确认或否认这是否应该做什么?
答案 0 :(得分:24)
我会这样做:
menuItem.setActionView(R.layout.action_view_layout);
让Android为您充气。
如果您需要对此ImageView调用进行一些额外更改
ImageView imageView = (ImageView) menuItem.getActionView();
<强>更新强>
为了迎合您的好奇心。这就是谷歌的人们所做的事情:
public MenuItem setActionView(int resId) {
final Context context = mMenu.getContext();
final LayoutInflater inflater = LayoutInflater.from(context);
setActionView(inflater.inflate(resId, new LinearLayout(context), false));
return this;
}
答案 1 :(得分:12)
你看看这个。它也很好地解释了布局充气机。
标准应用程序有两种可用的inflate()
方法版本:
inflate(int resource, ViewGroup root)
inflate(int resource, ViewGroup root, boolean attachToRoot)
第一个参数指向要扩充的布局资源。第二个参数是您要为要附加的资源充气的层次结构的根视图。当存在第三个参数时,它控制膨胀后的视图是否在充气后附加到提供的根。
这最后两个参数可能会引起一些混乱。使用此方法的两个参数版本,LayoutInflater将自动尝试将膨胀的视图附加到提供的根。但是,框架有一个检查,如果您为根传递null,它会绕过此尝试以避免应用程序崩溃。
许多开发人员认为这种行为意味着禁止附加通胀的正确方法是将root作为root传递;在许多情况下甚至没有意识到inflate()的三个参数版本存在。
答案 2 :(得分:3)
您通常希望传递任何(ViewGroup子类),您将要添加actionView以进行充气。为了从inflate调用中获取actionView而不是父节点,你需要添加第三个参数false,这样它就不会将膨胀的视图添加到父节点。
ImageView actionView =
(ImageView)layoutInflater.inflate(R.layout.action_view_layout, parent, false);
// .. do whatever you like with actionView and then add it to it's parent
menuItem.addActionView(actionView)
有一个非常好的教程here,但事情略有不同。它将action_view_layout
指定为menu.xml
的一部分,例如:
android:actionLayout="@layout/action_view_layout"
如果你总是使用相同的布局,这也可能对你有用。如果你走那条路,你就可以通过
获得ActionView
ImageView actionView = menu.findItem(R.id.whatever).getActionView();