8

我正在使用ActionMode.Callback,但我需要知道文本何时完成选择......例如

在此处输入图像描述

4

3 回答 3

3

在 .xml 中:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textIsSelectable="true" />

在班上:

textview.setCustomSelectionActionModeCallback(new callback(textview));
...
public class callback implements Callback {

    private TextView mTextView;

    public callback(TextView text) {
        this.mTextView = text;

    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        int start = mTextView.getSelectionStart();
        int end = mTextView.getSelectionEnd();
        Spannable wordtoSpan = (Spannable) mTextView.getText();

        switch (item.getItemId()) {

        case R.id.item_blue:
            wordtoSpan.setSpan(new BackgroundColorSpan(Color.BLUE), start
                    , end,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        singlenton.getInstance().getDatabase().createMarkText(mTextView,Color.BLUE);
            return true;

        case R.id.item_green:
            wordtoSpan.setSpan(new BackgroundColorSpan(Color.GREEN), start, end,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            singlenton.getInstance().getDatabase().createMarkText(mTextView,Color.GREEN);
            return true;

        case R.id.item_red:
            wordtoSpan.setSpan(new BackgroundColorSpan(Color.RED), start, end,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            singlenton.getInstance().getDatabase().createMarkText(mTextView,Color.RED);
            return true;
        case R.id.item_yellow:
            wordtoSpan.setSpan(new BackgroundColorSpan(Color.YELLOW), start, end,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            singlenton.getInstance().getDatabase().createMarkText(mTextView,Color.YELLOW);
            return true;
        case R.id.item_erase:
            wordtoSpan.setSpan(new BackgroundColorSpan(Color.TRANSPARENT), start, end,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            singlenton.getInstance().getDatabase().createMarkText(mTextView,Color.TRANSPARENT);
            return true;
        }
        return false;
    }

    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        mode.setTitle("Selecione a cor");
        mode.getMenuInflater().inflate(R.menu.menu_text_context, menu);

        return true;
    }

    @Override
    public void onDestroyActionMode(ActionMode mode) {

    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        menu.removeItem(android.R.id.selectAll);
        // Remove the "cut" option
        menu.removeItem(android.R.id.cut);
        // Remove the "copy all" option
        menu.removeItem(android.R.id.copy);
        return true;
    }

}
于 2015-01-16T18:03:26.417 回答
2

我想你可以在这里找到你的答案:

Android 文本选择监听器

ActionMode如果您的目标是蜂窝或更新的,您在这里寻找的关键术语是 ,以帮助您进行研究。

API 文档(向下滚动到“使用上下文操作模式)可以很好地解释事物,一旦你找到你正在寻找的东西,这是他们使用的最大障碍,但基本上你会需要什么要做的是:

  1. 将您EditText的设置为可选(android:textIsSelectable="true"setTextIsSelectable(true);
  2. 实现ActionMode.Callback接口并提供您自己的菜单项。

注意:如上所述,这仅适用于 API 级别 11+。如果您针对的是较早的平台,则获取文本选择的事件要复杂得多。

于 2013-06-14T10:53:54.323 回答
0

如果您需要没有 ActionMode 的监听器:

import android.content.Context
import android.util.AttributeSet
import android.widget.TextView

class TextViewWithObservableSelection @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0,
    defStyleRes: Int = 0
) : TextView(
    context,
    attrs,
    defStyleAttr,
    defStyleRes
) {
    private var selectedText: String = ""
        set(value) {
            if (field != value) {
                field = value
                observer?.invoke(value)
            }
        }

    private var observer: ((String) -> Unit)? = null
        set(value) {
            field = value
            field?.invoke(selectedText)
        }

    override fun onSelectionChanged(selStart: Int, selEnd: Int) {
        super.onSelectionChanged(selStart, selEnd)
        val startIndex = minOf(selStart, selEnd)
        val endIndex = maxOf(selStart, selEnd)
        selectedText = text.toString().substring(startIndex, endIndex)
    }

    fun observeSelectedText(observer: ((String) -> Unit)?) {
        this.observer = observer
    }
}
于 2019-09-28T03:52:08.973 回答