Color androide del efecto del borde del scrollview del lollipop
En mi aplicación cambio el color del efecto de resplandor de overscroll como este:
int glowDrawableId = contexto.getResources().getIdentifier("overscroll_glow", "drawable", "android"); Drawable androidGlow = contexto.getResources().getDrawable(glowDrawableId); assert androidGlow != null; androidGlow.setColorFilter(getResources().getColor(R.color.MyColor), PorterDuff.Mode.SRC_ATOP);
Pero cuando actualizé a lollipop este código se bloquea. Consigo siguiente código de error:
- NestedScrollView (NSV) en CoordinatorLayout (CL): NSV no en la parte superior cuando se carga
- Android: EditText no rellenar ScrollView y RelativeLayout
- ¿Por qué no android: windowSoftInputMode = "stateVisible | adjustResize" ajustar la pantalla cuando se muestra el teclado virtual?
- RelativeLayout dentro de scrollview no se desplaza
- ScrollView Inside Horizontal Scrollview no funciona correctamente
FATAL EXCEPTION: main Process: com.myproject.myapp, PID: 954 android.content.res.Resources$NotFoundException: Resource ID #0x0 at android.content.res.Resources.getValue(Resources.java:1233) at android.content.res.Resources.getDrawable(Resources.java:756) at android.content.res.Resources.getDrawable(Resources.java:724)
Parece que el recurso overscroll_glow falta en lollipop. ¿Cómo puedo lograr esto en Lollipop?
Gracias por adelantado.
- Habilitar desplazamiento dentro de EditText que está en ScrollView
- Anulación de onTouchEvent que compite con ScrollView
- Cómo hacer un Scroll Listener para WebView en Android
- Android ScrollView se niega a desplazarse hasta la parte inferior
- Hacer scrollbars flash de código (como iOS flashScrollIndicators)
- ¿Cómo desplazarse al centro de HorizontalScrollView sólo cuando se inicia la actividad?
- Cómo agregar dos listview en scrollview
- RecyclerView dentro de ScrollView / NestedScrollView no se desplaza correctamente
Puede especificar android:colorEdgeEffect
en su tema para cambiar el color de resplandor de overscroll en su aplicación completa. De forma predeterminada, esto hereda el valor de color primario establecido por android:colorPrimary
.
Res / values / themes.xml:
<style name="MyAppTheme" parent="..."> ... <item name="android:colorEdgeEffect">@color/my_color</item> </style>
Como alternativa, puede modificar este valor para una sola vista utilizando una superposición de temas en línea.
Res / values / themes.xml:
<!-- Note that there is no parent style or additional attributes specified. --> <style name="MyEdgeOverlayTheme"> <item name="android:colorEdgeEffect">@color/my_color</item> </style>
Res / layout / my_layout.xml:
<ListView ... android:theme="@style/MyEdgeOverlayTheme" />
La solución "android:colorEdgeEffect"
funciona perfectamente, y es mucho mejor que los hacks anteriores. Sin embargo, no se puede utilizar si el color del borde necesita cambiarse prorgramáticamente.
Sin embargo, es posible utilizar la reflexión para hacerlo, estableciendo los objetos EdgeEffect
directamente en las instancias de AbsListView
o ScrollView
. Por ejemplo:
EdgeEffect edgeEffectTop = new EdgeEffect(this); edgeEffectTop.setColor(Color.RED); EdgeEffect edgeEffectBottom = new EdgeEffect(this); edgeEffectBottom.setColor(Color.RED); try { Field f1 = AbsListView.class.getDeclaredField("mEdgeGlowTop"); f1.setAccessible(true); f1.set(listView, edgeEffectTop); Field f2 = AbsListView.class.getDeclaredField("mEdgeGlowBottom"); f2.setAccessible(true); f2.set(listView, edgeEffectBottom); } catch (Exception e) { e.printStackTrace(); }
EdgeEffect.setColor()
fue añadido en Lollipop.
Sin embargo, las mismas advertencias que cualquier solución basada en la reflexión.
En lollipop el color del efecto del overscroll se puede modificar para requisitos particulares con el colorPrimary del estilo del artículo:
<style name="MyApp" parent="Theme.AppCompat.Light"> <item name="colorPrimary">@color/mycolor</item> </style>
Este elemento también afecta al color de la barra de herramientas.
overscroll_glow.png
no existe en la plataforma 21. Puede copiar los recursos de la plataforma 20 y usarlos.
Puede encontrar overscroll_glow.png
en:
{SDK_FOLDER} \ plataformas \ android-20 \ data \ res
De esta manera usted no utiliza la reflexión que puede, como puede ver, jugar con su programa después de algunas actualizaciones.
Estoy usando esto para cambiar el color del borde programmatically en androide L. Esto trabaja para listView y scrollView, y las opinión las extienden.
@TargetApi(Build.VERSION_CODES.LOLLIPOP) private static void setEdgeEffectL(View scrollableView, int color) { final String[] edgeGlows = {"mEdgeGlowTop", "mEdgeGlowBottom", "mEdgeGlowLeft", "mEdgeGlowRight"}; for (String edgeGlow : edgeGlows) { Class<?> clazz = scrollableView.getClass(); while (clazz != null) { try { final Field edgeGlowField = clazz.getDeclaredField(edgeGlow); edgeGlowField.setAccessible(true); final EdgeEffect edgeEffect = (EdgeEffect) edgeGlowField.get(scrollableView); edgeEffect.setColor(color); break; } catch (Exception e) { clazz = clazz.getSuperclass(); } } } }
- Cómo configurar el menú en la barra de herramientas en Android
- StopService no deja de ser mi servicio … ¿por qué?