2012-11-22 40 views
7

Kích thước biểu tượng thanh tác vụ có thay đổi trong Android 4.2 không? Tôi đã có biểu tượng HDPI 120x48px được hiển thị hoàn hảo trong Android 4.1 trở xuống. Nó vẫn là.Kích thước biểu tượng thanh tác vụ trong Android 4.2

Tuy nhiên, trên bất kỳ thiết bị 4.2 nào, nó được đặt hình vuông để vừa với kích thước 48x48px so với những gì tôi có thể nhìn thấy. Hay đại loại thế; nó chắc chắn là một hình vuông.

Bất kỳ ý tưởng nào? Cảm ơn !

+5

Tôi đã tình cờ gặp vấn đề này. Tôi đã tìm thấy cam kết sau đây đã thêm tính năng "này": https://github.com/android/platform_frameworks_base/commit/c0047d4e111b8cfbffdbebb55f846c7ae935e53e – Hameno

+0

Đó là một tìm kiếm tuyệt vời, cảm ơn rất nhiều! Vì vậy, đoán chúng tôi không thể thực sự làm bất cứ điều gì, phải không? Hoặc là tôi sai ? –

+0

Đây là một chút vô lý. Cảm ơn rất nhiều Android. – annie

Trả lời

2

Vì vậy, tôi tìm thấy một câu trả lời, nó kinda hacky nhưng làm việc (TM):

Ý tưởng chung là để lắng nghe những thay đổi bố trí và áp dụng giới hạn mới cho drawables. Điều này có thể trông như thế này:

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

Sau đó, bạn phải gọi updateActionBar trong mọi hoạt động (tôi khuyên bạn nên thực hiện một hoạt động cơ sở trừu tượng mà từ đó bạn mở rộng) trong callbacks sau: onCreate onMenuOpened (tôi thấy rằng nó sẽ cải thiện hiệu suất và giảm nhấp nháy (thay đổi kích thước của drawables) nếu bạn gọi điều này bị trì hoãn (ví dụ 200ms)) onPrepareOptionsMenu (tôi thấy rằng nó sẽ cải thiện hiệu suất và giảm nhấp nháy (thay đổi kích thước của drawables) nếu bạn gọi này bị trì hoãn (ví dụ: 200ms))

Điều này phù hợp với tôi trên Nexus 7 và Nexus 10 với Android 4.2. Bạn có thể mong đợi nó thất bại với bản cập nhật trong tương lai nhưng ít nhất là bây giờ nó có vẻ làm việc.

+0

Ugh! Cảm ơn mã. – annie

+0

nhận lỗi cho "actionBarView.getChildAt (i3)" - i3 không thể được giải quyết thành biến –

5

Đây không phải là lý tưởng, nhưng có vẻ như bạn có thể vượt qua giới hạn này bằng cách sử dụng chế độ xem tác vụ tùy chỉnh.

Something như thế này:

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

đâu điểm @ layout/log_in_button vào một tập tin bố trí chứa một ImageButton với biểu tượng của bạn thiết lập như là src.

Bạn sẽ phải ràng buộc trình nghe nhấp chuột trong phương thức OnCreateOptionsMenu. Có một ví dụ điển hình ở đây: http://developer.android.com/guide/topics/ui/actionbar.html#ActionView.

Tôi chỉ học cách sử dụng phương pháp này, vì vậy tôi chưa biết liệu có bất kỳ sự sụt giảm lớn nào ngoài sự phức tạp gia tăng hay không.

Các vấn đề liên quan