Question

0I'm using startActionMode(ActionMode) on my app.

By default it's add a "Done" button on the bar, I want to remove it.

Also, if there's a way to change it's text, I want to know too, cause a different description than "Done" can make the action be correspondent to the behaviour of what it does.

Was it helpful?

Solution 3

Even I was stuck with same and I found this way to solve it.

int doneButtonId = Resources.getSystem().getIdentifier("action_mode_close_button", "id", "android");
LinearLayout layout = (LinearLayout) findViewById(doneButtonId);
TextView doneview = (TextView) layout.getChildAt(1);
doneview.setText("");

Hope this helps!!

OTHER TIPS

I agree with @CommonsWare that it is invalid design to hide the Done button.

However, there are customers that want to have this button removed and I can understand that the checkmark may cause confusion to users because it actually does nothing in some cases.

So, here is how to remove the button with styles:

<style name="AppTheme" parent="android:Theme.Holo">
    <item name="android:actionModeCloseButtonStyle">@style/NoCloseButton</item>
</style>

<style name="NoCloseButton" parent="@android:style/Widget.ActionButton.CloseMode">
    <item name="android:visibility">gone</item>
</style>

If you are using ActionBarSherlock you can hide the "Done" button with this style:

<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="NoCloseButton" parent="@style/Widget.Sherlock.ActionButton.CloseMode">
        <item name="android:visibility">gone</item>
    </style>

    <style name="AppBaseTheme" parent="Theme.Sherlock.Light.DarkActionBar">
        <item name="actionModeCloseButtonStyle">@style/NoCloseButton</item>
    </style>

    <!-- Application theme. -->
    <style name="AppTheme" parent="AppBaseTheme">

    </style>
</resources>

Please make sure to put this style in each style directory (values, value-v11, values-v14). After that you can create a custom menu with this code:

LayoutInflater inflater = LayoutInflater.from(getSherlockActivity());
View actionView = inflater.inflate(R.layout.actionmode, null);

ActionMode am = getSherlockActivity().startActionMode(mActionModeCallback);
am.setCustomView(actionView);

Thanks for Matthias Robbers, it works. But i perfer to use "invisible":

<style name="NoCloseButtonActionModeStyle">
   <item name="android:visibility">invisible</item>
</style>

So the custom view position in ActionMode will not indent to parent left.

any one find out screen width solution? – Mayur R. Amipara Jun 5 '15 at 10:27

override your custom view's onMeasure, set it's width to screen width. and in onLayout, relayout your child views.

it works for me.

import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.RelativeLayout;

import com.android.gallery3d.R;

public class SelectActionModeCustomView extends RelativeLayout {

    private View mLeftButton;
    private View mRightButton;

    private int mScreenWidth;

    private static final String TAG = "SelectActionView";

    public SelectActionModeCustomView(Context context, AttributeSet attrs) {
        super(context, attrs);

        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        mScreenWidth = metrics.widthPixels;
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        mLeftButton = findViewById(R.id.cancel);
        mRightButton = findViewById(R.id.select_action);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        this.setMeasuredDimension(mScreenWidth, this.getMeasuredHeight());
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        int childLeft = 0;
        int childTop = 0;

        childLeft = 0;
        childTop = ((b - t) - mLeftButton.getMeasuredHeight()) / 2;
        mLeftButton.layout(childLeft, childTop, 
                childLeft + mLeftButton.getMeasuredWidth(), 
                childTop + mLeftButton.getMeasuredHeight());

        childLeft = (r - l) - mRightButton.getMeasuredWidth();
        childTop = ((b - t) - mRightButton.getMeasuredHeight()) / 2;
        mRightButton.layout(childLeft, childTop, 
                childLeft + mRightButton.getMeasuredWidth(), 
                childTop + mRightButton.getMeasuredHeight());
    }


}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top