【问题标题】:Get Selected Text from TextView从 TextView 中获取选定的文本
【发布时间】:2014-05-14 22:57:15
【问题描述】:

我正在尝试获取用户在 TextView 中选择的文本, 我不想使用android:textIsSelectable="true" 来允许我的用户复制/粘贴操作

但是,一旦显示操作栏菜单,我不知道如何获取文本,目标是实现类似 Google 图书的行为:您选择一个单词,它会为您提供定义。

【问题讨论】:

  • 这个属性只是为了允许TextView里面的文字是否可以复制。
  • 我发现stackoverflow.com/a/13004720/460053 的答案对于我的特定用例来说比下面的要好。

标签: android textview


【解决方案1】:

我认为您正在寻找的是TextView.setCustomSelectionActionModeCallback。这将允许您在选择文本时创建自己的ActionMode.Callback。然后,您可以使用TextView.getSelectionStart 和TextView.getSelectionEnd 在选择MenuItem 时检索选定的文本。这是一个简单的例子:

    mTextView.setCustomSelectionActionModeCallback(new Callback() {

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            // Remove the "select all" option
            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;
        }

        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            // Called when action mode is first created. The menu supplied
            // will be used to generate action buttons for the action mode

            // Here is an example MenuItem
            menu.add(0, DEFINITION, 0, "Definition").setIcon(R.drawable.ic_action_book);
            return true;
        }

        @Override
        public void onDestroyActionMode(ActionMode mode) {
            // Called when an action mode is about to be exited and
            // destroyed
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            switch (item.getItemId()) {
                case DEFINITION:
                    int min = 0;
                    int max = mTextView.getText().length();
                    if (mTextView.isFocused()) {
                        final int selStart = mTextView.getSelectionStart();
                        final int selEnd = mTextView.getSelectionEnd();

                        min = Math.max(0, Math.min(selStart, selEnd));
                        max = Math.max(0, Math.max(selStart, selEnd));
                    }
                    // Perform your definition lookup with the selected text
                    final CharSequence selectedText = mTextView.getText().subSequence(min, max);
                    // Finish and close the ActionMode
                    mode.finish();
                    return true;
                default:
                    break;
            }
            return false;
        }

    });

结果

【讨论】:

  • 完美的正是我想要的,我找到了 getSelectionStart 等等,但正在寻找自定义操作模式!
  • 这是一个不错的解决方案
  • 有什么方法可以突出显示选定的文本。
  • 在onPrepareActionMode() 中调用menu.clear() 怎么样?它可能会更快、更安全。
  • 别忘了mTextView.setTextIsSelectable(true);
猜你喜欢
  • 2016-06-26
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
相关资源
最近更新 更多