原生的ActionMode的樣式厦画,難看的要死禁筏,很多時(shí)候,我們需要自定義ActionMode的樣子妆兑。
調(diào)用方法:
mCustomView = LayoutInflater.from(activity).inflate(R.layout.id, null);
mActionMode.setCustomView(mCustomView);
這時(shí)候贮预,即使你自定義的布局是MATCH_PARENT,他也無(wú)法鋪滿(mǎn)布局排嫌,上圖:
未充滿(mǎn)屏幕
看著實(shí)在太難受了畸裳,本人死磕一個(gè)下午,完全無(wú)解淳地,知道那個(gè)區(qū)域是返回鍵的區(qū)域怖糊,但就是無(wú)法讓它消失帅容。
原因: 這是源碼導(dǎo)致的,在actionBarContextView.java的onMeasure()方法中伍伤,可以看到并徘,沒(méi)有判斷mClose.visible == View.GONE的情況。就是說(shuō)扰魂,你即使將那塊區(qū)域設(shè)為Gone麦乞,但是系統(tǒng)仍然計(jì)算了他的寬度,這就導(dǎo)致了自定義的布局寬度變小阅爽。
方法:
- 在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
- 自定義一個(gè)父布局作為容器
該布局繼承RelativeLayout(也可以是其他Layout),在onMeasure()方法中付翁,將寬度設(shè)為屏幕寬度简肴,這樣他的子布局就可以充滿(mǎn)屏幕寬度啦!
代碼如下:
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);
}
}
此時(shí)百侧,將自定義布局的xml文件的父布局砰识,改為ActionModeCustomViewContainer,就OK啦!
再上圖:
充滿(mǎn)屏幕