今天需要用到自定义的actionbar,布局很简单:横向布局,一共三个View,两端分别一个View,中间一个,且中间View要填充满剩余的空间。
很快写好布局后,利用setCustomView()方法设置进去:
View customActionBar = LayoutInflater.from(this).inflate(R.layout.custom_action_bar, null);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setCustomView(customActionBar );
}
理想很丰满,显示很骨干,中间的View竟然不能填充满剩余的空间,开始怀疑写的布局有问题了,于是我把自定义的布局通过<include>进我的主布局中,结果测试正常,气人不!!!!!
好吧,应该Android在处理自定义的actionbar时有差异。
我相信肯定有前辈也踩过这个坑,先百度一下找找是否有坑友,并且是否留下足迹。哈哈,果真有坑友,跟随坑友的足迹试了一下方案,果真有效。原来问题出在这里:
View customActionBar = LayoutInflater.from(this).inflate(R.layout.custom_action_bar, null);
正确的使用方式应该是:
View customActionBar = LayoutInflater.from(this).inflate(R.layout.custom_action_bar,
new LinearLayout(this), false);
接下来我们简单的看一下LayoutInflater.inflate(int resource, @Nullable ViewGroup root, boolean attachToRoot)方法中参数的含义:
1、第一个参数resource:layout资源文件,它会被转成XmlResourceParser对象,XmlResourceParser对象可以解析layout.xml文件中的具体属性和标签等信息;
2、第二个参数root:它是给当前要填充的resource外层再加上的一层ViewGroup。
a、如果root为null,attachToRoot将没有意义,此时返回resource的根节点,且该根节点设置任何layout参数都没有意义,因为layout参数是描述自身在父控件或者容器下的属性,这时候没有容器,当然就失效了。
b、如果root不为null,attachToRoot设为true,则会给resource指定父布局root,即执行root.addView(resource, params),然后返回root,且root的layout参数会保留。
c、如果root不为null,attachToRoot设为false,则会将root最外层的layout属性设置为resource最外层的layout属性,即执行resource.setLayoutParams(params),然后返回resource。相当于root只提供布局参数。
3、第三个参数attachToRoot:是否要将我们的layout作为子View添加进布局中;
总结:如果可以传递root的情况下,就选择传递root;避免传入null,使得layout参数失效。
再次感谢坑友,我也记录一下,方便以后自己查阅。