Android在使用setCustomView时不能填满actionbar

      今天需要用到自定义的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参数失效。

 

再次感谢坑友,我也记录一下,方便以后自己查阅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值