Tamaño de icono de barra de acción en Android 4.2
¿Ha cambiado el tamaño del icono de la barra de acción en Android 4.2? He tenido un icono HDPI de 120x48px que se tradujo perfectamente en Android 4.1 y siguientes. Sigue siendo.
Sin embargo, en cualquier dispositivo de 4,2, es silenciado para encajar como 48x48px de lo que puedo ver. O algo así; Definitivamente es un cuadrado.
- El icono de herencia no se muestra al usar el icono de adaptación
- ¿Cuál es el icono de tamaño correcto para drawable-xxhdpi?
- ¿Cómo algunas aplicaciones de Android se hacen más grandes que los iconos recomendados?
- Vector drawables que se convierten automáticamente a pngs
- Mi icono de aplicación aparece más pequeño que otros
Algunas ideas ? Gracias !
- Establecer un icono de recurso compartido en Actionbar ShareActionProvider sin ActionBarSherlock
- ¿Por qué hay diferentes oppacities para iconos activos e inactivos en el diseño de material?
- Debe comprobar el icono dentro de su APK porque no es válido
- Android Parse Push Notification No se muestra Icono en Marshmallow
- Cómo tamaño de los iconos de marcadores personalizados para Android Google Maps v2?
- ¿Cómo agregar el indicador de "menú" junto al icono de la aplicación de Barra de Acción?
- Android - Tamaño del Icono del Lanzador
- Adición de texto a un icono de notificación
Por lo tanto, encontré una respuesta, es un poco hacky, pero funciona (TM):
La idea general es escuchar los cambios de diseño y aplicar nuevos límites a los drawables. Esto podría verse así:
public static void updateActionBar(final Activity activity) { if (Build.VERSION.SDK_INT >= 17) { try { final View content = activity.findViewById(android.R.id.content); if (content instanceof FrameLayout) { final FrameLayout contentFrameLayout = (FrameLayout) content; final ViewParent parent = contentFrameLayout.getParent(); if (parent instanceof LinearLayout) { final LinearLayout parentLinearLayout = (LinearLayout) parent; final Class<?> actionBarContainerClass = Class.forName("com.android.internal.widget.ActionBarContainer"); final Class<?> actionBarViewClass = Class.forName("com.android.internal.widget.ActionBarView"); final Class<?> actionMenuViewClass = Class.forName("com.android.internal.view.menu.ActionMenuView"); final Class<?> actionMenuItemViewClass = Class.forName("com.android.internal.view.menu.ActionMenuItemView"); for (int i = 0, childCount = parentLinearLayout.getChildCount(); i < childCount; i++) { final View parentLinearLayoutChild = parentLinearLayout.getChildAt(i); handleParentLinearLayoutChild(actionBarContainerClass, actionBarViewClass, actionMenuViewClass, actionMenuItemViewClass, parentLinearLayoutChild); } } } } catch (Exception e) { // Handle or ignore } } } private static void handleParentLinearLayoutChild(final Class<?> actionBarContainerClass, final Class<?> actionBarViewClass, final Class<?> actionMenuViewClass, final Class<?> actionMenuItemViewClass, final View parentLinearLayoutChild) { if (parentLinearLayoutChild instanceof FrameLayout && parentLinearLayoutChild.getClass().equals(actionBarContainerClass)) { final FrameLayout actionBarContainer = (FrameLayout) parentLinearLayoutChild; for (int i = 0, actionBarContainerChildCount = actionBarContainer.getChildCount(); i < actionBarContainerChildCount; i++) { final View actionBarContainerChild = actionBarContainer.getChildAt(i); handleActionBarContainerChild(actionBarViewClass, actionMenuViewClass, actionMenuItemViewClass, actionBarContainerChild); } } } private static void handleActionBarContainerChild(final Class<?> actionBarViewClass, final Class<?> actionMenuViewClass, final Class<?> actionMenuItemViewClass, final View actionBarContainerChild) { if (actionBarContainerChild instanceof ViewGroup && actionBarContainerChild.getClass().equals(actionBarViewClass)) { final ViewGroup actionBarView = (ViewGroup) actionBarContainerChild; actionBarView.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() { @Override public void onChildViewAdded(final View parent, final View child) { handleActionBarViewChild(child, actionMenuViewClass, actionMenuItemViewClass); } @Override public void onChildViewRemoved(final View parent, final View child) { } }); for (int i = 0, actionBarViewCount = actionBarView.getChildCount(); i < actionBarViewCount; i++) { handleActionBarViewChild(actionBarView.getChildAt(i3), actionMenuViewClass, actionMenuItemViewClass); } } } private static void handleActionBarViewChild(final View child, final Class<?> actionMenuViewClass, final Class<?> actionMenuItemViewClass) { try { if (child instanceof LinearLayout && child.getClass().equals(actionMenuViewClass)) { final LinearLayout actionMenuView = (LinearLayout) child; actionMenuView.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() { @Override public void onChildViewAdded(final View parent, final View child) { handleActionMenuViewChild(child, actionMenuItemViewClass); } @Override public void onChildViewRemoved(final View parent, final View child) { } }); for (int i = 0, actionMenuViewCount = actionMenuView.getChildCount(); i < actionMenuViewCount; i++) { handleActionMenuViewChild(actionMenuView.getChildAt(i), actionMenuItemViewClass); } } } catch (Exception e) { // Handle or ignore } } private static void handleActionMenuViewChild(final View child, final Class<?> actionMenuItemViewClass) { try { if (child instanceof TextView && child.getClass().equals(actionMenuItemViewClass)) { final TextView menuViewChild = (TextView) child; final Drawable[] compoundDrawables = menuViewChild.getCompoundDrawables(); final Drawable leftDrawable = compoundDrawables[0]; final int intrinsicWidth = leftDrawable.getIntrinsicWidth(); final int intrinsicHeight = leftDrawable.getIntrinsicHeight(); leftDrawable.setBounds(0, 0, intrinsicWidth , intrinsicHeight ); menuViewChild.setCompoundDrawables(leftDrawable, null, null, null); menuViewChild.setPadding(menuViewChild.getPaddingLeft(), 0, menuViewChild.getPaddingRight(), 0); menuViewChild.invalidate(); menuViewChild.requestLayout(); } } catch (Exception e) { // Handle or ignore } }
A continuación, debe llamar a updateActionBar en cada Actividad (sugiero hacer una actividad base abstracta de la que se extiende) en las siguientes devoluciones de llamada: onCreate onMenuOpened (encontré que mejoraría el rendimiento y reduciría el parpadeo (cambios de tamaño de los drawables) si llamas Esto demoró (por ejemplo, 200ms)) onPrepareOptionsMenu (encontré que mejoraría el rendimiento y reduciría el parpadeo (cambios de tamaño de los drawables) si se llama a este retrasado (por ejemplo, 200ms))
Esto funciona para mí en Nexus 7 y Nexus 10 con Android 4.2. Usted puede esperar que falla con las actualizaciones futuras, pero al menos por ahora parece que funciona.
Esto no es ideal, pero parece que puede evitar esta limitación mediante una vista de acción personalizada.
Algo como esto:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/log_in" android:title="Login" android:showAsAction="always" android:actionLayout="@layout/log_in_button"/> </menu>
Donde @ layout / log_in_button apunta a un archivo de diseño que contiene un ImageButton con su conjunto de iconos como src.
Tendrá que enlazar el oyente de clics en el método OnCreateOptionsMenu. Hay un ejemplo de medio camino aquí: http://developer.android.com/guide/topics/ui/actionbar.html#ActionView .
Acabo de aprender a utilizar este método, por lo que no sé aún si hay caídas importantes además de la mayor complejidad.
- Puntero nulo en getApplicationContext ()
- Google Analytics recoge un número de versión incorrecto para mi aplicación para Android