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

dlf*_*dlf 37 android actionview menuitem android-layout layout-inflater

我有一个ImageView我附加到MenuItemActionView(项目出现在ActionBar).此视图的布局来自XML.我这样膨胀它:

ImageView actionView = (ImageView) layoutInflater.inflate(
   R.layout.action_view_layout, null);
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常.然而; root在调用中传递null inflate()使Lint对我大喊:

避免将null作为视图根传递(需要解析膨胀布局的根元素上的布局参数)

在我的具体情况下,我似乎可以在没有root的情况下进行管理,但我宁愿让代码尽可能正确.问题是,我不确定哪个View应该用作根.这个答案说它应该是"围绕想要膨胀的视图对象的小部件".但这意味着什么呢?动作栏的那一个?活动?还有别的吗?


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

  1. 得到ActionBar View对应的MenuItem
  2. 扎根吧
  3. 把根投成一个 ViewGroup
  4. 将结果传递给inflater

这似乎有效.任何人都可以确认或否认这是否应该做什么?

Dam*_*tla 24

我会这样做:

menuItem.setActionView(R.layout.action_view_layout);
Run Code Online (Sandbox Code Playgroud)

让Android为您充气.

如果您需要对此ImageView调用进行一些额外的更改

ImageView imageView = (ImageView) menuItem.getActionView();
Run Code Online (Sandbox Code Playgroud)

更新

为了迎合您的好奇心.这就是谷歌的人们所做的事情:

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;
}
Run Code Online (Sandbox Code Playgroud)


Top*_*Cat 13

你看看这个.它也很好地解释了布局充气机.

inflate()标准应用程序有两种可用的方法版本:

inflate(int resource, ViewGroup root)
inflate(int resource, ViewGroup root, boolean attachToRoot)
Run Code Online (Sandbox Code Playgroud)

第一个参数指向要扩充的布局资源.第二个参数是您要为要附加的资源充气的层次结构的根视图.当存在第三个参数时,它控制膨胀后的视图是否在充气后附加到提供的根.

最后两个参数可能会引起一些混乱.使用此方法的两个参数版本,LayoutInflater将自动尝试将膨胀的视图附加到提供的根.但是,框架有一个检查,如果您为根传递null,它会绕过此尝试以避免应用程序崩溃.

许多开发人员认为这种行为意味着禁止附加通胀的正确方法是将root作为root传递; 在许多情况下甚至没有意识到inflate()的三个参数版本存在.

有关布局通胀的更多信息

  • -1这个答案只是从文章中复制,从而解释了什么(好的)通货膨胀.OP可能知道这一点,并且询问一个特殊情况,这个答案没有添加任何内容 (2认同)

小智 5

您通常希望传递要添加 actionView 的任何内容(ViewGroup 子类)以进行 inflate。为了从 inflate 调用中返回 actionView 而不是父视图,您需要添加第三个参数 false,这样它就不会将 inflate 视图添加到父视图。

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)
Run Code Online (Sandbox Code Playgroud)

这里有一个非常好的教程,内容略有不同。它指定为类似以下内容action_view_layout的一部分:menu.xml

android:actionLayout="@layout/action_view_layout"
Run Code Online (Sandbox Code Playgroud)

如果您始终使用相同的布局,这也可能对您有用。如果你走那条路,你就能通过ActionView做得到

ImageView actionView = menu.findItem(R.id.whatever).getActionView();
Run Code Online (Sandbox Code Playgroud)