EditText cómo activar copia / pegar popup sin barra de acción?

Estoy bajo delphi y uso el framework android para crear una edición. Cuando pongo el tema a Theme.DeviceDefault.Light.NoActionBar entonces puedo seleccionar un poco de texto en mi EditText y tengo un popup con "select all / cut / copy / paste / etc" como se puede ver en la imagen de abajo.

Sin embargo, cuando selecciono Theme.Material.Light.NoActionBar o Theme.Holo.Light.NoActionBar entonces no puedo seleccionar cualquier texto en mi EditText (no tengo derecho o izquierda de selección de texto maneja) y por supuesto no tengo Cualquier copia / pega popup

¿Es su forma de tener esta copia / pegar popup en Theme_Material_Light_NoActionBar?

Introduzca aquí la descripción de la imagen Theme.DeviceDefault.Light.NoActionBar

Introduzca aquí la descripción de la imagen Theme_Material_Light_NoActionBar

Introduzca aquí la descripción de la imagen Theme.Holo.Light.NoActionBar

NOTA 1:

Cuando muevo la pantalla a la horizontal, entonces el edittext tomar todo el espacio disponible, y luego puedo ver mi derecha y izquierda de selección de texto se maneja como en la imagen de abajo, pero creo que es porque el tema de intercambio a Theme.DeviceDefault.Light.NoActionBar Cuando muevo la pantalla a la horizontal pero no estoy seguro:

Introduzca aquí la descripción de la imagen

NOTA 2 :

En mi editText, cuando hago setCustomSelectionActionModeCallback (nuevo Callback () {}), entonces la devolución de llamada nunca se llama 🙁 esto no es normal, creo? ¿Qué en el editText puede prohibir la devolución de llamada?

NOTA 2 :

Puedo seleccionar el texto en todo el tema (pero no puedo copiarlo fuera del curso), pero excepto en Theme.DeviceDefault.Light.NoActionBar no puedo ver la derecha y izquierda la selección de texto manejar.

NOTA 3 :

Theme.DeviceDefault.Light.NoActionBar mostrar el control de selección de texto derecha e izquierda sólo en algunos teléfonos como la galaxia Samsung. En algún otro no funcionó.

NOTA 4 :

Encontré parcialmente la fuente del problema! Es porque creo mi vista a través de WindowManager.addView (view, layout_params) y de esta manera startactionmodeforChild devuelve null y esto prohíbe la barra de acción y la selección de texto maneja para ser show. Ahora si hago algo como esto en mi edittext:

@Override public ActionMode startActionMode(ActionMode.Callback callback) { Activity host = (Activity) this.getContext(); return host.getWindow().getDecorView().startActionMode(callback); } 

Entonces puedo ver la derecha y la izquierda de acción de texto maneja (pero no en el malvavisco, es trabajo sólo en lollipop esto no sé por qué). Mi problema ahora es que la barra de acción se muestra, pero se muestra vacío 🙁 nada se dibuja dentro (pero puedo ver que el control de corte / copia / pasado están dentro de la jerarquía vista de vertedero) Así que ahora no estoy buscando un camino Para reemplazar esta barra de acción por un menú emergente en su lugar (como en la imagen Theme.DeviceDefault.Light.NoActionBar). ¿Alguna idea?

Añada el siguiente en su actividad

 ActionMode mActionMode; 

Y usted tiene que crear una interfaz de 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) { } } 

Donde contextual_menu.xml es como sigue con los iconos requeridos

 <?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> 

Ahora habilite su ActionBar Contextual (CAB) De la siguiente manera, como por ejemplo, aquí estoy habilitando en un clic largo de un textview

 yourtextView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { mActionMode = MainActivity.this.startActionMode(new ActionBarCallback()); return true; } }); 

Entonces usted tiene que escribir su propia acción al hacer clic en cada evento de acción en CAB.

~ Bounty Hunter Más detalles aquí

Para el nivel 11 de la API o superior, puede detener la aparición de los menús contextuales de copia, pegado, corte y personalización.

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

Devolver false de onCreateActionMode (ActionMode, Menu) evitará que se inicie el modo de acción (acciones Select All, Cut, Copy y Paste).

Solución: Sustituya isSuggestionsEnabled y canPaste en EditText.

Para la solución rápida, copie la clase a continuación: esta clase reemplaza a la clase EditText y bloquea todos los sucesos en consecuencia.

Para los detalles arenoso, sigue leyendo.

La solución consiste en evitar que el menú PASTE / REPLACE aparezca en el método show () de la clase android.widget.Editor (no documentada). Antes de que aparezca el menú, se hace un chequeo para if (! CanPaste &&! CanSuggest) return ;. Los dos métodos que se utilizan como base para establecer estas variables están ambos en la clase EditText:

isSuggestionsEnabled() es pública y, por lo tanto, puede ser anulada. canPaste() no es, y por lo tanto debe ser ocultado mediante la introducción de una función del mismo nombre en la clase derivada. Así que incorporando estas actualizaciones en una clase que también tiene el setCustomSelectionActionModeCallback , y el deshabilitado haga clic en largo, aquí es la clase completa para evitar toda la edición (pero todavía mostrar el controlador de selección de texto) para controlar el cursor:

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

Intente utilizar el tema Theme.AppCompat.Light.NoActionBar .
También establece android:textIsSelectable="true" en su EditText en el archivo xml.

  • Cómo crear una contraseña entera EditText mediante programación
  • Cómo hacer un texto específico en TextView BOLD
  • Cómo obtener el número de líneas de TextView?
  • Autolink dentro de un TextView en android
  • Fuente de Tamil Android entre la palabra inglesa
  • Con quién comparar un fondo Recurso de imagen TextView con una imagen R.drawable.bg_image para cambiar
  • ¿Cómo puedo reducir el espaciado entre texto en mi diseño de Android?
  • Hipervínculo de TextView de Android
  • Cómo cambiar programaticamente un TextView a un ImageView y volver
  • ¿Cómo buscar una palabra en una cadena y resaltar una palabra en una vista de texto en android?
  • Configuración de la fuente Roboto en TextView - xml
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.