No se puede personalizar la apariencia de EditText seleccionar handle / anchor en landscape
Estoy teniendo un rato difícil que modifica la manija de la selección de EditText. Estoy siguiendo este hilo:
Cómo cambiar el color / apariencia de EditText select handle / anchor?
- EditText Settext no funciona con Fragment
- Android: no se puede obtener valor de EditText dentro de Custom Dialog
- La Barra de estado aparece cuando aparece el teclado virtual pero no se oculta cuando el teclado virtual desaparece mientras está en Modo Immersivo
- Validación en Editar texto
- Obtener una cadena de texto de EditText?
Parece bastante sencillo. Sin embargo, no puedo conseguir que funcione en el paisaje. ¿Puede alguien detectar lo que estoy haciendo mal? Casi me pegó el mismo código en una actividad de prueba, pero las manijas de ancla 'son siempre los mismos. Intenté usar estilos según lo sugerido y programmatically. Aún así siempre obtengo el mismo defecto blue anchors 🙁
Estoy en Turrón no estoy seguro de si hace alguna diferencia.
Actividad de prueba:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTheme(R.style.MyCustomTheme); setContentView(R.layout.activity_main); final EditText editText = (EditText) findViewById(R.id.edit1); // tried programatically too and no success try { final Field fEditor = TextView.class.getDeclaredField("mEditor"); fEditor.setAccessible(true); final Object editor = fEditor.get(editText); final Field fSelectHandleLeft = editor.getClass().getDeclaredField("mSelectHandleLeft"); final Field fSelectHandleRight = editor.getClass().getDeclaredField("mSelectHandleRight"); final Field fSelectHandleCenter = editor.getClass().getDeclaredField("mSelectHandleCenter"); fSelectHandleLeft.setAccessible(true); fSelectHandleRight.setAccessible(true); fSelectHandleCenter.setAccessible(true); fSelectHandleLeft.set(editor, ContextCompat.getDrawable(this, R.drawable.small_rect)); fSelectHandleRight.set(editor, ContextCompat.getDrawable(this, R.drawable.small_rect)); fSelectHandleCenter.set(editor, ContextCompat.getDrawable(this, R.drawable.small_rect)); } catch (final Exception e) { Log.d("CUSTOM_ANCHORS", e.toString()); } }
Diseño:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:id="@+id/edit1" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Hello World" android:textSize="20sp" /> </LinearLayout>
Mis estilos:
<!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> <style name="MyCustomTheme" parent="@style/AppTheme"> <item name="android:textSelectHandle">@drawable/small_rect</item> <item name="android:textSelectHandleLeft">@drawable/small_rect</item> <item name="android:textSelectHandleRight">@drawable/small_rect</item> </style>
El dibujable (small_rect.xml)
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <size android:width="20dp" android:height="20dp" /> <gradient android:angle="90" android:centerColor="#D6D6D6" android:endColor="#4B6CD6" android:startColor="#6586F0" /> <corners android:radius="0dp" /> </shape>
el resultado:
- Custom EditText no muestra el teclado en el enfoque
- Cómo deshabilitar auto-complete y auto-correct de EditText
- Frontera para EditText?
- Android: ¿Cómo puedo recuperar Edittext.getText () en AlertDialog personalizado?
- ¿Cómo puedo evitar la ejecución de onTextChanged en el EditText de Android
- ActionDone imeOption no funciona en EditText en Android 2.3
- Cursor Edittext es invisible en Android 4.0
- EditText en la vista de desplazamiento en android
<EditText android:imeOptions="flagNoFullscreen" />
Puede utilizar android:imeOptions
para indicar al sistema que no muestre la interfaz de usuario de edición en pantalla completa.
El siguiente código funciona perfectamente en Nougat
<EditText android:layout_width="match_parent" style="@style/MyCustomTheme" android:text="@string/app_name" android:layout_height="wrap_content" /> <style name="MyCustomTheme" parent="@style/AppTheme"> <item name="android:textSelectHandle">@android:drawable/arrow_down_float</item> <item name="android:textSelectHandleLeft">@android:drawable/arrow_down_float</item> <item name="android:textSelectHandleRight">@android:drawable/arrow_down_float</item> </style>
Ustedes código de trabajo sólo en el retrato (así lo hace el mío). Mi aplicación es sólo paisaje y miré a mi alrededor y parece que este es un error del sistema operativo. Se lo notificé a google. Sin embargo, si hay una solución aún utilizando el EditText los 50 puntos todavía está en juego.
Creo que su dirección personalizada EditText se puede implementar con sólo xml.
-
Defina el estilo de la manija en sus estilos.xml:
<style name="CustomSelectHandle"> <item name="android:textSelectHandle">@drawable/small_rect</item> <item name="android:textSelectHandleLeft">@drawable/small_rect</item> <item name="android:textSelectHandleRight">@drawable/small_rect</item> </style>
-
Agregue el atributo de estilo a su EditText:
<EditText android:id="@+id/edit1" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Hello World" style="@style/CustomSelectHandle" android:textSize="20sp" />
Acabo de ejecutar una prueba rápida de esto en un dispositivo KitKat, y las manijas personalizadas estaban allí.
Actualización: he duplicado el problema con el modo de paisaje en el teléfono KitKat. Sin embargo, el error no afecta a todos los dispositivos. En particular, cuando ejecuté el código en modo horizontal en una tableta, las personalizadas manejas funcionó bien.
Observación adicional: El EditText que probé esto encendido también tenía un fondo drawable. Este dibujable aparece como se esperaba tanto en modo retrato como en modo horizontal, tanto en teléfonos como en tablets. Sin embargo, si realmente editar el campo en modo horizontal en un teléfono, desaparece el fondo personalizado y el campo tiene un fondo blanco hasta que dejo el modo de edición.
Conjetura: Parece que Android se ejecuta a través de una ruta de código diferente (que ignora el formato personalizado) al editar campos en modo horizontal en dispositivos pequeños. Cuando se muestra un teclado virtual en modo horizontal, no deja mucho espacio para mostrar el campo que se está editando en un teléfono. Así que tal vez los desarrolladores hicieron un compromiso en algún momento (que es mejor mostrar un campo de texto muy simple para el usuario para editar, que el riesgo de tener el campo entero oscurecido). Sin profundizar en el código fuente, esa es mi mejor conjetura para lo que está pasando aquí …
Agregue un atributo XML a su EditText
android:textColorHighlight="@color/accent_translucent"
Trate de añadir
<item name="colorControlActivated">@drawable/small_rect</item>
A tus estilos