2012-11-22 20 views
7

क्या एंड्रॉइड 4.2 में एक्शन बार आइकन आकार बदल गया है? मेरे पास 120x48px HDPI आइकन है जो एंड्रॉइड 4.1 और उसके बाद में पूरी तरह से प्रस्तुत किया गया था। यह अभी भी है।Android में एक्शन बार आइकन आकार 4.2

हालांकि, किसी भी 4.2 डिवाइस पर, यह जो मैं देख सकता हूं उससे 48x48px के रूप में फिट होने के लिए squelched है। या कुछ इस तरह का; यह निश्चित रूप से एक वर्ग है।

कोई विचार? धन्यवाद !

+5

मैंने इस मुद्दे पर ठोकर खाई है। मुझे निम्नलिखित प्रतिबद्धता मिली है जो इस "फीचर" को जोड़ती है: https://github.com/android/platform_frameworks_base/commit/c0047d4e111b8cfbffdbebb55f846c7ae935e53e – Hameno

+0

यह एक शानदार खोज है, बहुत बहुत धन्यवाद! तो अनुमान लगाओ कि हम वास्तव में कुछ भी नहीं कर सकते हैं, है ना? या मैं गलत हूँ ? –

+0

यह थोड़ा हास्यास्पद है। बहुत बहुत धन्यवाद एंड्रॉइड। – annie

उत्तर

2

तो, मैं एक जवाब मिल गया है, यह (टीएम) थोड़े hacky है, लेकिन काम करता है:

सामान्य विचार लेआउट हुए परिवर्तनों पर ध्यान और ड्रॉएबल करने के लिए नए सीमा लागू करने के लिए है। यह ऐसा दिखाई दे सकता:

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 (मैंने पाया कि यह होगा यदि आप इस देरी से कॉल करते हैं तो प्रदर्शन में सुधार करें और ड्रॉकर्स के आकार में परिवर्तन (उदाहरण के लिए 200ms)) ऑनपेरेपॉप्शनमेनू (मुझे पता चला है कि यह प्रदर्शन में सुधार करेगा और फ्लेयरिंग (ड्रॉबल्स के आकार में परिवर्तन) को कम करेगा यदि आप इस देरी को कॉल करते हैं (उदाहरण के लिए 200 एमएमएस))

यह एंड्रॉइड 4.2 के साथ नेक्सस 7 और नेक्सस 10 पर मेरे लिए काम करता है। आप भविष्य के अपडेट के साथ असफल होने की उम्मीद कर सकते हैं लेकिन कम से कम अब यह काम करता प्रतीत होता है।

+0

उह! कोड के लिए धन्यवाद। – annie

+0

"actionBarView.getChildAt (i3)" के लिए त्रुटि हो रही है - i3 को एक चर के लिए हल नहीं किया जा सकता –

5

यह आदर्श नहीं है, लेकिन ऐसा लगता है कि आप एक कस्टम एक्शन व्यू का उपयोग कर इस सीमा के आसपास हो सकते हैं।

कुछ इस तरह:

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

मैंने केवल इस विधि का उपयोग करना सीखा है, इसलिए मुझे अभी तक पता नहीं है कि जटिलता के अलावा कोई बड़ी गिरावट है।

संबंधित मुद्दे