Подтвердить что ты не робот

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). Любая идея?

4b9b3361

Ответ 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 файле.