代码之家  ›  专栏  ›  技术社区  ›  Sasha Shpota A-Bag

如何在文本视图中选择文本时覆盖“复制”、“共享”和“全选”选项

  •  0
  • Sasha Shpota A-Bag  · 技术社区  · 6 年前

    我有一个 TextView 用户可以在其中选择文本。默认情况下,将显示以下选项:“复制”、“共享”和“全选”。 我需要用自定义选项覆盖它们。但我不知道怎么做。我查阅了文件 this nice article 但并不缺乏。这篇文章解释了当用户按下三点按钮时如何扩展菜单,这不是我所需要的。

    如何覆盖文本部分菜单中的默认“复制”、“共享”和“全选”选项?

    以下是我的观点:

    <TextView
        android:id="@+id/transcript"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scrollbars="vertical" />
    

    在java代码中,我有:

    transcript.setTextIsSelectable(true);
    transcript.setFocusable(true);
    transcript.setFocusableInTouchMode(true);
    
    1 回复  |  直到 6 年前
        1
  •  6
  •   Ben P.    6 年前

    你可以用 TextView.setCustomSelectionActionModeCallback()

    文档: https://developer.android.com/reference/android/widget/TextView.html#setCustomSelectionActionModeCallback(android.view.ActionMode.Callback)

    我放了一个非常简单的应用程序来演示如何使用这个功能。

    主活动.java

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            TextView text = (TextView) findViewById(R.id.text);
    
            CustomActionModeCallback callback = new CustomActionModeCallback(this);
            text.setCustomSelectionActionModeCallback(callback);
        }
    }

    <FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <TextView
            android:id="@+id/text"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="16dp"
            android:text="@string/lorem_ipsum"
            android:textIsSelectable="true"/>
    
    </FrameLayout>

    CustomActionModeCallback.java文件

    public class CustomActionModeCallback implements ActionMode.Callback {
    
        private final Context context;
    
        public CustomActionModeCallback(Context context) {
            this.context = context;
        }
    
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            menu.clear();
            mode.getMenuInflater().inflate(R.menu.menu_custom, menu);
            return true;
        }
    
        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return false;
        }
    
        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            if (item.getItemId() == R.id.custom_one) {
                Toast.makeText(context, "One!", Toast.LENGTH_SHORT).show();
                mode.finish();
                return true;
            }
            else if (item.getItemId() == R.id.custom_two) {
                Toast.makeText(context, "Two!", Toast.LENGTH_SHORT).show();
                mode.finish();
                return true;
            }
            else if (item.getItemId() == R.id.custom_three) {
                Toast.makeText(context, "Three!", Toast.LENGTH_SHORT).show();
                mode.finish();
                return true;
            }
    
            return false;
        }
    
        @Override
        public void onDestroyActionMode(ActionMode mode) {
    
        }
    }

    菜单\u custom.xml

    <menu
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    
        <item
            android:id="@+id/custom_one"
            android:title="One"
            app:showAsAction="never"/>
    
        <item
            android:id="@+id/custom_two"
            android:title="Two"
            app:showAsAction="never"/>
    
        <item
            android:id="@+id/custom_three"
            android:title="Three"
            app:showAsAction="never"/>
    
    </menu>

    没什么好评论的 MainActivity 或者xml文件。所有的魔法都发生在 CustomActionModeCallback

    两者 onCreateActionMode() onPrepareActionMode() onCreateActionMode()

    enter image description here enter image description here

    如果你使用 onPrepareActionMode()

    enter image description here

    请注意,您必须 return true 不管怎样(返回false会导致菜单不显示),但是您只需要 onPrepareActionMode()

    onActionItemClicked() Toast 然后关闭上下文菜单(使用 ActionMode.finish() 返回true

    最后, onDestroyActionMode()