自定义ActionMode的样式,自定义布局无法充满

原生的ActionMode的样式,难看的要死,很多时候,我们需要自定义ActionMode的样子。

调用方法:

mCustomView = LayoutInflater.from(activity).inflate(R.layout.id, null);
mActionMode.setCustomView(mCustomView);

这时候,即使你自定义的布局是MATCH_PARENT,他也无法铺满布局,上图:


未充满屏幕

看着实在太难受了,本人死磕一个下午,完全无解,知道那个区域是返回键的区域,但就是无法让它消失。

原因: 这是源码导致的,在actionBarContextView.java的onMeasure()方法中,可以看到,没有判断mClose.visible == View.GONE的情况。就是说,你即使将那块区域设为Gone,但是系统仍然计算了他的宽度,这就导致了自定义的布局宽度变小。

方法:

  1. 在style.xml中:
@style/NoCloseButton


即:自定义CloseButton的样式,然后将visibility置为gone

  1. 自定义一个父布局作为容器
    该布局继承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啦!
再上图:


充满屏幕

你可能感兴趣的:(自定义ActionMode的样式,自定义布局无法充满)