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?

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:

Introduzca aquí la descripción de la imagen

  <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. Introduzca aquí la descripción de la imagen

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.

  1. 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> 
  2. 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

  • Android EditText: seleccione todo el texto mientras toque y borre cuando el usuario comience a escribir.
  • Tipo de texto de correo electrónico android
  • EditText pierde el foco en el clic
  • EditText pierde contenido en desplazamiento en ListView
  • Android show EditText.setError () encima del EditText y no debajo de él
  • Android ClickableSpan que no llama onClick
  • ¿Puedes hacer una entrada de EditText de derecha a izquierda?
  • ¿Cómo utilizar EditText onTextChanged evento cuando presiono el número?
  • ¿Cómo puedo limitar el número de caracteres introducidos en un cuadro de diálogo de alerta? EditText
  • Evitar el descarte de diálogo en la rotación de la pantalla en Android
  • Android EditText texto no está centrado verticalmente
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.