textappearance - theme editor android studio
Editar texto ¿Cómo activar copiar/pegar ventana emergente sin ninguna barra de acción? (3)
Para el nivel de API 11 o superior, puede detener la aparición de los menús de contexto de copiar, pegar, cortar y personalizar.
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;
}
});
Si se devuelve falso desde onCreateActionMode (ActionMode, Menu), se evitará que se inicie el modo de acción (acciones Seleccionar, Cortar, Copiar y Pegar).
Solución: anular isSuggestionsEnabled y canPaste en EditText.
Para la solución rápida, copie la clase a continuación: esta clase anula la clase EditText y bloquea todos los eventos en consecuencia.
Para los detalles arenosos, sigue leyendo.
La solución radica en evitar que el menú PEGAR / REEMPLAZAR aparezca en el método show () de la clase (no documentada) android.widget.Editor. Antes de que aparezca el menú, se verifica si (! CanPaste &&! CanSuggest) devuelve ;. Los dos métodos que se utilizan como base para establecer estas variables están en la clase EditText:
isSuggestionsEnabled()
es público y, por lo tanto, puede ser anulado. canPaste()
no lo es, y por lo tanto debe ocultarse introduciendo una función del mismo nombre en la clase derivada. Así que incorporando estas actualizaciones en una clase que también tiene setCustomSelectionActionModeCallback
, y el clic prolongado desactivado, aquí está la clase completa para evitar toda edición (pero aún 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) {}
}
}
Estoy bajo Delphi y uso el marco de Android para crear una edición. Cuando configuro el tema como Theme.DeviceDefault.Light.NoActionBar, entonces puedo seleccionar un texto en mi EditText y tengo una ventana emergente con "seleccionar todo / cortar / copiar / pegar / 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 ningún texto en mi EditText (no tengo controles de selección de texto a derecha o izquierda) y, por supuesto, no tengo cualquier ventana emergente de copiar / pegar
¿Hay alguna forma de tener esta ventana emergente de copiar / pegar en Theme_Material_Light_NoActionBar?
Theme.DeviceDefault.Light.NoActionBar
Theme_Material_Light_NoActionBar
NOTA 1:
Cuando muevo la pantalla a la horizontal, el texto de edición toma todo el espacio disponible, y luego puedo ver mis controles de selección de texto derecho e izquierdo como en la imagen de abajo, pero creo que es porque el tema cambia 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 el Callback nunca se llama :( esto no es normal, creo. ¿Qué en el editText puede prohibir la devolución de llamada?
NOTA 2 :
Puedo seleccionar texto en todo el tema (pero no puedo copiarlo fuera de curso), pero excepto en Theme.DeviceDefault.Light.NoActionBar no puedo ver el selector de texto derecho e izquierdo.
NOTA 3 :
Theme.DeviceDefault.Light.NoActionBar muestra la selección de texto derecha e izquierda solo en algunos teléfonos como la galaxia Samsung. En algunos otros 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 que la barra de acción y los controles de selección de texto se muestren. 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);
}
luego puedo ver los controles de acción de texto derecho e izquierdo (pero no en Marshmallow, funciona solo en paletas, no sé por qué). Mi problema ahora es que se muestra la barra de acción, pero se muestra vacía :( no se dibuja nada dentro (pero puedo ver que el control cortar / copiar / pasado está dentro de la jerarquía de vista de volcado). Así que ahora no estoy buscando una manera para reemplazar esta barra de acción por un menú emergente en su lugar (como en la imagen Theme.DeviceDefault.Light.NoActionBar). ¿Alguna idea?
Trate de usar el tema Theme.AppCompat.Light.NoActionBar .
También configure android:textIsSelectable="true"
en su EditText en el archivo xml.
añade lo siguiente en tu actividad
ActionMode mActionMode;
y tienes que crear una interfaz 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 el siguiente con los iconos necesarios
<?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 barra de acción contextual (CAB) Como se muestra a continuación, por ejemplo, aquí estoy habilitando en un clic largo de una vista de texto
yourtextView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
mActionMode = MainActivity.this.startActionMode(new ActionBarCallback());
return true;
}
});
luego tiene que escribir su propia acción haciendo clic en cada evento de acción en CAB.
~ Bounty Hunter Más detalles aquí