dlf*_*dlf 37 android actionview menuitem android-layout layout-inflater
我有一个ImageView我附加到MenuItem它ActionView(项目出现在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应该用作根.这个答案说它应该是"围绕想要膨胀的视图对象的小部件".但这意味着什么呢?动作栏的那一个?活动?还有别的吗?
更新:阅读答案让我怀疑我正确的做法是:
ActionBar View对应的MenuItemViewGroup这似乎有效.任何人都可以确认或否认这是否应该做什么?
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()的三个参数版本存在.
小智 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)