2012-11-22 26 views
7

Android 4.2'de işlem çubuğu simge boyutu değişti mi? Android 4.1 ve altında mükemmel bir şekilde oluşturulmuş bir 120x48px HDPI simgesi vardı. Hala öyle.Android 4.2'de eylem çubuğu simgesi boyutu

Ancak, herhangi bir 4.2 cihazda, gördüğüm kadarı ile 48x48px olarak uyacak şekilde squelched edilir. Ya da böyle bir şey; kesinlikle bir meydan.

Herhangi bir fikrin var mı? Teşekkürler !

+5

Bu aynı konuda tökezledim. Ben bulduk bu "özelliğini" ekledi hangi taahhüt aşağıdadır: https://github.com/android/platform_frameworks_base/commit/c0047d4e111b8cfbffdbebb55f846c7ae935e53e – Hameno

+0

Bu harika bir vurgunu sayesinde bir sürü! Sanırım gerçekten hiçbir şey yapamıyoruz, değil mi? Yoksa yanılıyor muyum? –

+0

Bu biraz saçma. Çok teşekkürler Android. – annie

cevap

2

Yani, bir cevap buldum, o (TM) tür hacky ama çalışır:

genel bir fikir düzeni değişiklikleri işler ve drawables yeni sınır uygulamaktır. Bu, bu gibi görünebilir:

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

Daha sonra her Aktivite updateActionBar aramak zorunda aşağıdaki geri çağrıları (Sana uzandığı soyut bir temel faaliyeti yapmanızı öneriyorum): onCreate onMenuOpened (Ben öyle olacağına bulundu performansını artırmak ve siz) onPrepareOptionsMenu bu gecikmiş (örneğin 200ms) ararsanız titreyen (drawables büyüklüğü değişiklikleri) azaltmak, bu gecikmiş (örneğin 200ms ararsanız (Ben performansını artırmak ve (titreyen drawables büyüklüğü değişiklikleri azaltacağını bulundu)))

Bu, Android 4.2 ile Nexus 7 ve Nexus 10'da benim için çalışıyor

. Gelecekteki güncellemelerle başarısız olmasını bekleyebilirsiniz ancak en azından şimdilik işe yarayacaktır.

+0

Ugh! Kod için teşekkürler. – annie

+0

"actionBarView.getChildAt (i3)" hatası alınıyor - i3 bir değişkene çözümlenemiyor –

5

Bu, ideal değil, ancak özel bir eylem görünümü kullanarak bu sınırlamayı aşabileceğiniz anlaşılıyor. Böyle

şey:

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

Nerede src gibi ayarlayın simgeli bir ımagebutton içeren bir düzen dosyasına @ düzen/log_in_button puan.

Sen OnCreateOptionsMenu yönteminde tıklama işleyicisi bağlamak zorunda kalacaktır. Burada yarım örnek iyi bir örnek var: http://developer.android.com/guide/topics/ui/actionbar.html#ActionView.

ben sadece bu yöntemi kullanmak öğrenmiş, böylece artan karmaşıklığı yanında herhangi bir büyük downfalls varsa Henüz bilmiyorum.

İlgili konular