Intereting Posts
Как получить местоположение GPS для Android IllegalArgumentException: значение привязки в индексе 1 равно null Как повысить производительность базы данных SQLite для Android Активация Bluetooth Активация диалогового окна предупреждения после поворота экрана Как запустить устройство Genymotion с командой оболочки? Исключение NullPointerException при добавлении / удалении просмотров RelativeLayout (анимации) Отображение даты в формате DatePicker для Android Как назвать мой пакет android, если у меня нет сайта Добавление представлений в определенном порядке и сохранение этого порядка Error: не удается найти метод символов getMap () после обновления зависимостей Robolectric test ListView не обновляется после изменения стоимости адаптера Настройки Android замораживаются при использовании ADT Plugin v9 с Eclipse на Mac? Где вызвать getChildFragmentManager ()? Ошибка получения Gradle «Не удалось зарезервировать достаточно места для кучи объектов» в Intellij IDEA Что означает трехмерное значение в функциональных параметрах?

Размер значка панели действий в Android 4.2

Был ли размер значка панели действий изменен в Android 4.2? У меня был значок HDPI размером 120×48 пикселей, который отлично отображался в Android 4.1 и ниже. Это все еще так.

Тем не менее, на любом 4.2-устройстве, он будет помещен как 48x48px из того, что я вижу. Или что-то типа того; Это определенно квадрат.

Есть идеи ? Благодаря !

Solutions Collecting From Web of "Размер значка панели действий в Android 4.2"

Итак, я нашел ответ, это хакки, но работает (TM):

Основная идея – прослушивать изменения макета и применять новые границы к чертежам. Это может выглядеть так:

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 } } 

Затем вам нужно вызвать updateActionBar в каждой Деятельности (я предлагаю сделать абстрактную базовую активность, из которой вы распространяетесь) в следующих обратных вызовах: onCreate onMenuOpened (я обнаружил, что это улучшит производительность и уменьшит мерцание (изменения размера выделенных объектов), если вы позвоните Это отложено (например, 200 мс)) наPrepareOptionsMenu (я обнаружил, что это улучшит производительность и уменьшит мерцание (изменения размера чертежей), если вы назовете это отложенным (например, 200 мс)),

Это работает для меня на Nexus 7 и Nexus 10 с Android 4.2. Вы можете ожидать, что он потерпит неудачу с будущими обновлениями, но, по крайней мере, сейчас это работает.

Это не идеально, но, похоже, вы можете обойти это ограничение, используя пользовательский вид действия.

Что-то вроде этого:

 <?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> 

Где @ layout / log_in_button указывает на файл макета, содержащий ImageButton, с вашим значком, установленным как src.

Вам придется привязать прослушиватель кликов в методе OnCreateOptionsMenu. Здесь есть наполовину хороший пример: http://developer.android.com/guide/topics/ui/actionbar.html#ActionView .

Я только что научился использовать этот метод, поэтому пока не знаю, есть ли какие-то крупные проблемы, кроме повышенной сложности.