EditText, как активировать всплывающее окно copy/paste без какой-либо панели действий?
I m в delphi, и я использую фреймворк android для создания редактирования. Когда я задал тему Theme.DeviceDefault.Light.NoActionBar, тогда я могу выбрать текст в своем EditText, и у меня есть всплывающее окно с "select all/cut/copy/paste/etc", как вы можете см. на рисунке ниже.
Однако, когда я выбираю Theme.Material.Light.NoActionBar или Theme.Holo.Light.NoActionBar, тогда я не может выбрать любой текст в моем EditText (у меня нет правых или левых текстовых дескрипторов) и, конечно же, у меня нет всплывающего окна copy/paste
Есть ли у них какой-либо способ создать всплывающее окно copy/paste на Theme_Material_Light_NoActionBar?
Theme.DeviceDefault.Light.NoActionBar
Theme_Material_Light_NoActionBar
Theme.Holo.Light.NoActionBar
ПРИМЕЧАНИЕ 1:
Когда я перемещаю экран на горизонтальный, тогда edittext возьмет все свободное пространство, а затем я смогу увидеть мои правые и левые клавиши выделения текста, как на картинке ниже, но я думаю, что это связано с тем, что тема сводится к Theme.DeviceDefault.Light.NoActionBar, когда я перемещаю экран в горизонтальное положение, но не уверен:
![введите описание изображения здесь]()
ПРИМЕЧАНИЕ 2:
В моем editText, когда я делаю setCustomSelectionActionModeCallback (новый Callback() {}), тогда Callback никогда не вызывается:( Это не нормально, я думаю? Что в редактореText может запретить обратный вызов?
ПРИМЕЧАНИЕ 2:
Я могу выбрать текст во всех темах (но я не могу его скопировать), но за исключением Theme.DeviceDefault.Light.NoActionBar, я не вижу дескриптор выбора правого и левого текста.
ПРИМЕЧАНИЕ 3:
Theme.DeviceDefault.Light.NoActionBar показывает дескриптор выбора правого и левого текста только на некоторых телефонах, таких как галактика samsung. По какой-то другой причине это не сработало.
ПРИМЕЧАНИЕ 4:
я нашел частично источник проблемы! потому что я создаю свое представление через WindowManager.addView(view, layout_params), и таким образом startactionmodeforChild возвращает null, и это запрещает отображение панели действий и дескрипторов выбора текста. Теперь, если я сделаю что-то подобное в своем edittext:
@Override
public ActionMode startActionMode(ActionMode.Callback callback) {
Activity host = (Activity) this.getContext();
return host.getWindow().getDecorView().startActionMode(callback);
}
тогда я могу видеть правые и левые текстовые манипуляторы (но не на зефир, он работает только на леденец, я не знаю почему). Моя проблема в том, что панель действий показана, но она показала пусто: (ничто не выводит внутрь (но я вижу, что элемент управления cut/copy/past находится внутри иерархии представлений дампа). Так что теперь я не ищу способ вместо этой панели действий вместо этого появляется всплывающее меню (например, на картинке Theme.DeviceDefault.Light.NoActionBar). Любая идея?
Ответы
Ответ 1
добавить в свою деятельность следующие действия
ActionMode mActionMode;
и вам нужно создать интерфейс ActionMondeCallback
class ActionBarCallback implements ActionMode.Callback
{
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.contextual_menu, menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
int id = item.getItemId();
if(id == R.id.item_delete)
{
tv.setText("");
Toast.makeText(MainActivity.this,"option deleted",Toast.LENGTH_LONG);
}
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
}
}
где contextual_menu.xml выглядит следующим образом с необходимыми значками
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context="com.example.letschat"
>
<item
android:id="@+id/item_search"
android:icon="@android:drawable/ic_menu_search"
app:showAsAction="ifRoom|withText"
android:title="Delete"
android:titleCondensed="Delete">
</item>
<item
android:id="@+id/item_delete"
android:icon="@android:drawable/ic_menu_delete"
app:showAsAction="ifRoom|withText"
android:title="Delete"
android:titleCondensed="Delete">
</item>
<item
android:id="@+id/item_share"
android:icon="@android:drawable/ic_menu_share"
app:showAsAction="ifRoom|withText"
android:title="Delete"
android:titleCondensed="Delete">
</item>
</menu>
Теперь включите свой контекстный ActionBar (CAB). Как следует, например, здесь am позволяют включить длительный щелчок текстового поля
yourtextView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
mActionMode = MainActivity.this.startActionMode(new ActionBarCallback());
return true;
}
});
тогда вы должны написать свое собственное действие при щелчке по каждому событию действия на CAB.
~ Охотник за головами
Подробнее здесь
Ответ 2
Для уровня API 11 или выше вы можете прекратить копирование, вставку, вырезание и пользовательские контекстные меню из.
edittext.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
public void onDestroyActionMode(ActionMode mode) {
}
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
return false;
}
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
return false;
}
});
Возврат false из onCreateActionMode (ActionMode, Menu) предотвратит запуск режима действия (выберите "Все", "Вырезать", "Копировать" и "Вставить" ).
Решение: переопределение isSuggestionsEnabled и canPaste в EditText.
Для быстрого решения скопируйте класс ниже - этот класс переопределяет класс EditText и соответственно блокирует все события.
Для подробных данных продолжайте чтение.
Решение заключается в предотвращении появления меню PASTE/REPLACE в методе show() (не документированного) класса android.widget.Editor. Перед появлением меню выполняется проверка, чтобы (! CanPaste &! CanSuggest) вернуть;. Два метода, которые используются в качестве основы для установки этих переменных, находятся в классе EditText:
isSuggestionsEnabled()
является общедоступным и, следовательно, может быть переопределен.
canPaste()
не является и, следовательно, должен быть скрыт, введя функцию с тем же именем в производном классе.
Таким образом, включение этих обновлений в класс, который также имеет setCustomSelectionActionModeCallback
, и отключенный длинный щелчок, вот полный класс, который запрещает все редактирование (но все же отображает обработчик выбора текста) для управления курсором:
package com.cjbs.widgets;
import android.content.Context;
import android.util.AttributeSet;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
/**
* This is a thin veneer over EditText, with copy/paste/spell-check removed.
*/
public class NoMenuEditText extends EditText
{
private final Context context;
/** This is a replacement method for the base TextView class' method of the same name. This
* method is used in hidden class android.widget.Editor to determine whether the PASTE/REPLACE popup
* appears when triggered from the text insertion handle. Returning false forces this window
* to never appear.
* @return false
*/
boolean canPaste()
{
return false;
}
/** This is a replacement method for the base TextView class' method of the same name. This method
* is used in hidden class android.widget.Editor to determine whether the PASTE/REPLACE popup
* appears when triggered from the text insertion handle. Returning false forces this window
* to never appear.
* @return false
*/
@Override
public boolean isSuggestionsEnabled()
{
return false;
}
public NoMenuEditText(Context context)
{
super(context);
this.context = context;
init();
}
public NoMenuEditText(Context context, AttributeSet attrs)
{
super(context, attrs);
this.context = context;
init();
}
public NoMenuEditText(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
this.context = context;
init();
}
private void init()
{
this.setCustomSelectionActionModeCallback(new ActionModeCallbackInterceptor());
this.setLongClickable(false);
}
/**
* Prevents the action bar (top horizontal bar with cut, copy, paste, etc.) from appearing
* by intercepting the callback that would cause it to be created, and returning false.
*/
private class ActionModeCallbackInterceptor implements ActionMode.Callback
{
private final String TAG = NoMenuEditText.class.getSimpleName();
public boolean onCreateActionMode(ActionMode mode, Menu menu) { return false; }
public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; }
public boolean onActionItemClicked(ActionMode mode, MenuItem item) { return false; }
public void onDestroyActionMode(ActionMode mode) {}
}
}
Ответ 3
Попробуйте использовать тему Theme.AppCompat.Light.NoActionBar.
Также установите android:textIsSelectable="true"
в свой файл EditText в XML файле.