原生的ActionMode的样式,难看的要死,很多时候,我们需要自定义ActionMode的样子。
调用方法:
mCustomView = LayoutInflater.from(activity).inflate(R.layout.id, null);
mActionMode.setCustomView(mCustomView);
这时候,即使你自定义的布局是MATCH_PARENT,他也无法铺满布局,上图:
未充满屏幕
看着实在太难受了,本人死磕一个下午,完全无解,知道那个区域是返回键的区域,但就是无法让它消失。
原因: 这是源码导致的,在actionBarContextView.java的onMeasure()方法中,可以看到,没有判断mClose.visible == View.GONE的情况。就是说,你即使将那块区域设为Gone,但是系统仍然计算了他的宽度,这就导致了自定义的布局宽度变小。
方法:
- 在style.xml中:
<item name="android:actionModeCloseButtonStyle">@style/NoCloseButton</item>
<style name="NoCloseButton" parent="@android:style/Widget.ActionButton.CloseMode">
<item name="android:visibility">gone</item>
</style>
即:自定义CloseButton的样式,然后将visibility置为gone
- 自定义一个父布局作为容器
该布局继承RelativeLayout(也可以是其他Layout),在onMeasure()方法中,将宽度设为屏幕宽度,这样他的子布局就可以充满屏幕宽度啦!
代码如下:
public class ActionModeCustomViewContainer extends RelativeLayout{
WindowManager wm;
public void init(Context context){
wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
}
public ActionModeCustomViewContainer(Context context) {
super(context);
init(context);
}
public ActionModeCustomViewContainer(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public ActionModeCustomViewContainer(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(getDefaultSize(0, widthMeasureSpec), getDefaultSize(0, heightMeasureSpec));
int width = wm.getDefaultDisplay().getWidth();
widthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
此时,将自定义布局的xml文件的父布局,改为ActionModeCustomViewContainer,就OK啦!
再上图:
充满屏幕