移除ActionMode的“Done”按钮

21

我在我的应用程序中使用startActionMode(ActionMode)。

默认情况下,它会在栏上添加一个“完成”按钮,我想要删除它。

另外,如果有一种方法可以更改其文本,我也想知道,因为与“完成”不同的描述可以使操作对其所做的行为相对应。


提供一张图片可以让你所说的更清晰明了。 - JoxTraex
2
在我看来,你想要的是无效的设计。根据定义,用户可以取消操作模式,例如按下“返回”按钮。操作模式默认应为非破坏性:激活操作模式,然后按下“返回”(或点击“完成”)不应对用户数据造成任何更改。 - CommonsWare
嗯...这也是真的。那么有没有办法更改文本,以便用户不会感到困惑呢?因为有时“取消”比“完成”更好描述。谢谢! - Marcos Vasconcelos
@MarcosVasconcelos:也许可以通过主题来实现,API中没有相关内容。 - CommonsWare
嗯,我尝试找了一些东西,但是只有自定义样式的方法,而没有自定义文本本身的方法。即使有这种方法,我也需要有一些“完成”和其他“取消”的选项。 - Marcos Vasconcelos
5个回答

44

我同意@CommonsWare的观点,隐藏完成按钮是无效的设计。

然而,有些客户希望移除此按钮,我可以理解这个勾号可能会导致用户混淆,因为在某些情况下它实际上没有任何作用。

所以,以下是如何使用样式移除该按钮:

<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>

伟大的API 11+解决方案,但有没有办法在API 8+上实现?我使用ActionBarSherlok,有没有隐藏它的方法?ActionModeCloseButtonStyle需要API 11+。 - Cilenco
3
actionModeCloseButtonStyle(不加android:)应该适用于ABS。 - Matthias Robbers
你是对的,谢谢。我添加了一个适用于Android API8+的ABS答案。 - Cilenco
2
它可以工作,但是如果我扩展自定义布局,它不能占据整个宽度。这是唯一的问题。 - sandeepmaaram
1
@MatthiasRobbers,我已经尝试了上述的CAB样式,并将NoCloseButton的可见性设置为gone,但它仍然占用空间,不允许添加其他图标。 - krisDrOid

2
如果您正在使用ActionBarSherlock,可以使用以下样式隐藏“完成”按钮:
<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>

请确保将此样式放在每个样式目录中(values,value-v11,values-v14)。之后,您可以使用以下代码创建自定义菜单:
LayoutInflater inflater = LayoutInflater.from(getSherlockActivity());
View actionView = inflater.inflate(R.layout.actionmode, null);

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

1
但是这里的actionView没有占据整个屏幕宽度。 - sandeepmaaram
1
是的。但是在这里,actionView没有占据整个屏幕宽度。 - Qadir Hussain
有人找到屏幕宽度的解决方案了吗? - Mayur R. Amipara

1
感谢 Matthias Robbers,它起作用了。但我更喜欢使用 "invisible":
<style name="NoCloseButtonActionModeStyle">
   <item name="android:visibility">invisible</item>
</style>

因此,在ActionMode中,自定义视图的位置不会缩进到父级左侧。

1

我曾经也遇到同样的问题,后来找到了解决方法。

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

希望这有所帮助!

11
这是一个不可靠的解决方案,因为它假设了可能会发生变化的实现细节。 - CommonsWare
1
无法工作,我尝试了这个,但是出现了空指针异常。我应该在什么时候调用这个方法?我正在使用片段。 - Iftikar Urrhman Khan
1
空指针异常是因为ActionMode尚未完全初始化。尝试在onCreateActionMode()方法中使用view.postDelayed(Runnable action, long delayMillis)来延迟一段时间! - codezjx

0

有人找到屏幕宽度的解决方案了吗?- Mayur R. Amipara 2015年6月5日10:27

重写您自定义视图的onMeasure方法,将其宽度设置为屏幕宽度。在onLayout中,重新布局您的子视图。

这对我很有效。

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());
    }


}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接