在膨胀布局以用于MenuItem ActionView时,我应该为root传递什么?

时间:2014-05-24 14:30:54

标签: android android-layout menuitem layout-inflater actionview

我有一个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表示它应该是围绕您想要膨胀的视图对象的小部件。"但这意味着什么呢?动作栏的那一个?活动?还有其他什么呢?


更新:阅读答案让我怀疑我正确的做法是:

  1. 获取与ActionBar
  2. 对应的View MenuItem
  3. 扎根
  4. 将根投射到ViewGroup
  5. 将结果传递给inflater
  6. 这似乎有效。任何人都可以确认或否认这是否应该做什么?

3 个答案:

答案 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()的三个参数版本存在。

More on Layout Inflation

答案 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();