Вы можете использовать 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()
, система добавит некоторые дополнительные опции в меню переполнения, например:
Если вы используете onPrepareActionMode()
, дополнительные элементы не будут добавлены.
Обратите внимание, что вы должны return true
из onCreateActionMode()
несмотря ни на что (возвращение false приводит к тому, что меню не отображается), но вам нужно только return true
из onPrepareActionMode()
, если вы действительно изменили меню.
Вы можете обрабатывать щелчки пользователя на вашемнестандартные элементы внутри onActionItemClicked()
.В моем примере я просто показываю Toast
и затем закрываю контекстное меню (используя ActionMode.finish()
).В этом методе вы должны return true
только для пунктов меню, которые вы обрабатываете сами;возвращение false позволяет системе выполнить действие по умолчанию (например, если вы хотите дать пользователю возможность выбрать весь текст).
Наконец, onDestroyActionMode()
вызывается при закрытии меню.Возможно, у вас есть для этого какое-то применение;Я не сделал.