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.

Algunas ideas ? Gracias !

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.

  • ¿Puedo cambiar el icono y el nombre de la aplicación de Android en una versión posterior?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.