Android 4.2中的動作欄圖標大小是否已更改? 我有一個120x48px HDPI圖標,在Android 4.1及更高版本中完美呈現。它仍然是。Android 4.2中的動作欄圖標大小
但是,在任何4.2設備上,它被壓制爲適合我所能看到的48x48像素。或類似的東西;這絕對是一個廣場。
任何想法?謝謝 !
Android 4.2中的動作欄圖標大小是否已更改? 我有一個120x48px HDPI圖標,在Android 4.1及更高版本中完美呈現。它仍然是。Android 4.2中的動作欄圖標大小
但是,在任何4.2設備上,它被壓制爲適合我所能看到的48x48像素。或類似的東西;這絕對是一個廣場。
任何想法?謝謝 !
於是,我找到了答案,它有點哈克但工程(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毫秒)) onPrepareOptionsMenu(我發現如果你調用這個延遲的話,它會提高性能並減少閃爍(drawables的大小變化) ))
這適用於我在Nexus 7和Nexus 10與Android 4.2。你可以期待它在未來的更新中失敗,但至少目前看起來似乎有效。
呃!感謝代碼。 – annie
錯誤「actionBarView.getChildAt(i3)」 - i3無法解析爲變量 –
這並不理想,但似乎您可以通過使用自定義操作視圖來解決此限制。
事情是這樣的:
<?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>
凡@佈局/ log_in_button點佈局文件,其中包含與您的圖標設置爲SRC的ImageButton的。您將不得不綁定OnCreateOptionsMenu方法中的點擊偵聽器。這裏有一個很好的例子:http://developer.android.com/guide/topics/ui/actionbar.html#ActionView。
我只是學會了使用這種方法,所以我不知道除了增加的複雜性之外是否還有任何重大的缺陷。
我偶然發現了這個同樣的問題。我發現以下提交添加了這個「功能」:https://github.com/android/platform_frameworks_base/commit/c0047d4e111b8cfbffdbebb55f846c7ae935e53e – Hameno
這是一個很棒的發現,非常感謝!所以猜測我們不能做任何事情,對吧?或者我錯了? –
這有點可笑。非常感謝Android。 – annie