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
- Android - ¿Por qué autolink ignora la ruta raíz de una URL?
- Cómo puedo obtener el texto en una línea específica en un TextView
- Despliegue y alineación de la distribución relativa de Android
- Diferencia entre setText () y append ()
- Android TextView con enlaces clicables: cómo capturar clics?
¿Es su forma de tener esta copia / pegar popup en Theme_Material_Light_NoActionBar?
Theme.DeviceDefault.Light.NoActionBar
Theme_Material_Light_NoActionBar
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:
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?
- Sobreponiendo problema en Android TextView
- Cómo establecer el peso de la fuente como luz, regular en Android
- ¿Cómo evito completamente que TextView se desplace?
- ¿Cómo hacer TextView en Android envolver y ajustar el texto maravillosamente?
- Cómo eliminar ellipsized propiedad de TextView de código?
- Enlaces con clic dentro de la vista de lista
- Cómo alinear el texto dentro de TextView en Android?
- Android: dibujar línea en una vista de texto
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.
- No se pueden reproducir algunos vídeos de Youtube con la API de reproductor de YouTube para Android
- Deshabilitar el botón de selección mientras selecciona la ubicación de la ubicación anónima mediante la opción Colocar selector google API en android