Как переопределить параметры «Копировать», «Поделиться» и «Выбрать все» при выделении текста в TextView - PullRequest
0 голосов
/ 11 октября 2018

У меня есть TextView, где пользователь может выбрать текст.По умолчанию отображаются следующие параметры: «Копировать», «Поделиться» и «Выбрать все».Мне нужно переопределить их с помощью пользовательских параметров.Но я не могу найти, как это сделать.Я просмотрел документацию и эту прекрасную статью , но не без недостатка.В статье объясняется, как расширить меню, когда пользователь нажимает кнопку с тремя точками, а это не то, что мне нужно.

Вопрос: Как переопределить стандартные «Копировать», «Поделиться»и «Выбрать все» в меню текстового раздела?

Вот как выглядит мой вид:

<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 Ответ

0 голосов
/ 11 октября 2018

Вы можете использовать TextView.setCustomSelectionActionModeCallback() для этого.

Документация: https://developer.android.com/reference/android/widget/TextView.html#setCustomSelectionActionModeCallback(android.view.ActionMode.Callback)

Я собрал очень простое приложение, чтобы продемонстрировать, как использовать эту функцию.

MainActivity.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);
    }
}

activity_main.xml

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

    }
}

menu_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 из onCreateActionMode()несмотря ни на что (возвращение false приводит к тому, что меню не отображается), но вам нужно только return true из onPrepareActionMode(), если вы действительно изменили меню.

Вы можете обрабатывать щелчки пользователя на вашемнестандартные элементы внутри onActionItemClicked().В моем примере я просто показываю Toast и затем закрываю контекстное меню (используя ActionMode.finish()).В этом методе вы должны return true только для пунктов меню, которые вы обрабатываете сами;возвращение false позволяет системе выполнить действие по умолчанию (например, если вы хотите дать пользователю возможность выбрать весь текст).

Наконец, onDestroyActionMode() вызывается при закрытии меню.Возможно, у вас есть для этого какое-то применение;Я не сделал.

...