Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android 5.0 Lollipop: setColorFilter "filtra" en otros botones

Estoy usando setColorFilter para establecer el filtro de color de ONE de mi botón. Esto ha estado funcionando perfectamente hasta la actualización de Android Lollipop 5.0. Ahora, el filtro de color parece filtrarse en mis otros botones, incluso cuando cierro la actividad y vuelvo a abrir (se restablece si cierro la aplicación y vuelvo a abrirla).

Mi styles.xml (v21): (igual que antiguo excepto aquí su padre es Material, antes de que fuera Holo)

  • EditText stucks después de animación y vivo de vuelta en el desplazamiento ...?
  • Android: No se pudo encontrar com.android.support:support-v4:23.2.1
  • Depuración de Kernel de Android
  • Mostrar enormes imágenes en Android
  • Android: Cómo implementar viewpager y vistas en un único archivo xml
  • Gears o HTML5 Location API en Android 1.5
  •  <style name="Theme.FullScreen" parent="@android:style/Theme.Material.Light.NoActionBar.Fullscreen"> <item name="android:buttonStyle">@style/StandardButton</item> <item name="android:windowTranslucentStatus">true</item> </style> 

    Mi styles.xml (para todas las versiones):

     <style name="StandardButton" parent="android:style/Widget.Button"> <item name="android:background">@android:drawable/btn_default</item> </style> 

    Mi botón:

     <Button android:id="@+id/mainMenuButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="mainMenu" android:text="@string/button_mainMenu" android:visibility="gone" /> 

    Mi código:

     Button mainMenuButton = (Button) findViewById(R.id.mainMenuButton); mainMenuButton.getBackground().setColorFilter(new PorterDuffColorFilter(getResources().getColor(R.color.light_green), PorterDuff.Mode.MULTIPLY)); mainMenuButton.setVisibility(View.VISIBLE); 

    El color:

     <color name="light_green">#5CD65C</color> 

    El resultado:

    Abro la aplicación, luego la actividad del juego y todos los botones se muestran correctamente. Presiono el botón para establecer el filtro de color, volver al menú principal y reabrir la actividad del juego y ahora todos los botones son verdes.

    ¿Algunas ideas?

  • Quiero un círculo de progreso en lugar de un diálogo de progreso
  • Atributo de configuración del elemento hijo del diseño incluido
  • Visor dinámico de altura
  • Android Location.getAccuracy () devuelve 1
  • Escala de imagen manteniendo su relación de aspecto en fondo dibujable
  • Método get () de AsyncTask: ¿Existe algún escenario en el que realmente sea la mejor opción?
  • 3 Solutions collect form web for “Android 5.0 Lollipop: setColorFilter "filtra" en otros botones”

    El problema es que el fondo Drawable se reutiliza en muchas vistas. Para asegurarse de que Drawable no se comparta entre varias vistas, debe utilizar el método mutate .

    Véase: mutate ()

    Ejemplo de código:

     Drawable background = mainMenuButton.getBackground(); background.mutate(); background.setColorFilter(new PorterDuffColorFilter(getResources().getColor(R.color.light_green), PorterDuff.Mode.MULTIPLY)); mainMenuButton.setBackground(background); 

    OP aquí. Gracias por tus sugerencias. El uso del código siguiente solucionó el problema.

    Ajuste del filtro

     Drawable background = getResources().getDrawable(android.R.drawable.btn_default); background.setColorFilter(new PorterDuffColorFilter(getResources().getColor(R.color.light_green), PorterDuff.Mode.MULTIPLY)); mainMenuButton.setBackground(background); // Use setBackgroundDrawable for API<16 mainMenuButton.setVisibility(View.VISIBLE); 

    Los otros botones no se volvieron verdes.

    Borrado del filtro

    Lo que sucedió después fue que parecía que Android (en parte) ignoró mi llamada para borrar el filtro de color (que sucede más tarde en el código). "En parte", porque era verde, pero cuando lo pulsé, se volvió amarillo (que es btn_default comportamiento en contraposición a verde oscuro con el filtro). Para corregir esto, tuve que cambiar mi orden de llamada de función a lo siguiente:

     mainMenuButton.setVisibility(View.VISIBLE) mainMenuButton.getBackground().clearColorFilter(); mainMenuButton.invalidate(); 

    NOTA: Esto sin embargo invierte el comportamiento del botón. Cuando presiono (y mantengo) en el botón, parece que todavía tiene el comportamiento del filtro de color verde en él y se convierte en verde oscuro. Cuando lo suelto vuelve a ser gris como por btn_default. ¿Alguna sugerencia sobre esto?

    Espero que esto al menos de alguna manera ayude a otra persona con este extraño problema, que para mí sólo ocurrió en Android 5.0 Lollipop API nivel 21. (He probado API 8, 9, 12, 13, 16, 17, 18 y 19 donde este problema No parece ser ART con su compilación AOT como yo esperaba, ya que la habilitación de ART en un dispositivo Android 4.4.4 no causó este problema.) Curiosamente, mutate() tampoco funcionó, como I Habría esperado

    La instancia del dibujable se comparte entre todos los botones, por lo que configurar un filtro de color cambia todos ellos (no ve los cambios inmediatamente porque los botones no invalidan inmediatamente).

    Intente cargar el BitmapFactory.decodeResource(getResources(), android.R.drawable.btn_default, null) manualmente ( BitmapFactory.decodeResource(getResources(), android.R.drawable.btn_default, null) ) y entonces BitmapFactory.decodeResource(getResources(), android.R.drawable.btn_default, null) como el fondo del botón.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.