23

Gần đây tôi đã phát triển một ứng dụng Android, trong đó tôi cần phải có bố cục tùy chỉnh và thứ nguyên cho thanh tab. Cách mà tôi đã làm nó cho đến bây giờ là bằng cách sử dụng thư viện ActionBarSherlock của Jake Wharton để hỗ trợ các phiên bản Android trước HoneyComb, và bằng cách áp dụng một phong cách cho ứng dụng mà tôi chỉnh sửa mục style actionBarSize.Thay đổi chiều cao thanh tác vụ trên Android JellyBean

Bây giờ, tôi đã thử nghiệm ứng dụng trên Galaxy S3 (với Jellybean trên đó), và chiều cao thanh tab không thay đổi nữa theo giá trị actionBarSize.

Vì vậy, tôi đã bắt đầu tìm kiếm thông qua mã Jellybean, và tôi thấy phương pháp này trong lớp ActionBarPolicy:

public int getTabContainerHeight() { 
      TypedArray a = mContext.obtainStyledAttributes(null, R.styleable.ActionBar, 
       com.android.internal.R.attr.actionBarStyle, 0); 
      int height = a.getLayoutDimension(R.styleable.ActionBar_height, 0); 
      Resources r = mContext.getResources(); 
      if (!hasEmbeddedTabs()) { 
       // Stacked tabs; limit the height 
       height = Math.min(height, 
         r.getDimensionPixelSize(R.dimen.action_bar_stacked_max_height)); 
      } 
      a.recycle(); 
      return height; 
    } 

Từ những gì tôi thu thập trong phương pháp này, có vẻ như Jellybean hạn chế chiều cao của TabBar, khi ứng dụng ở chế độ dọc, bằng cách đặt chiều cao thanh tab thành giá trị thứ nguyên "action_bar_stacked_max_height" (là 48dp, trong tệp /values/dimen.xml của 4.1), mặc dù tôi đã đặt chiều cao thanh tác vụ trong actionBarSize.

Tôi đã cố gắng ghi đè giá trị thứ nguyên này, bằng cách đặt giá trị đó thành giá trị của riêng tôi trong tệp dimen.xml của riêng tôi, nhưng tôi không có may mắn. Nó không hoạt động.

Câu hỏi của tôi:

Do you guys biết của một cách thức mà tôi có thể ghi đè lên "action_bar_stacked_max_height" giá trị dimen?

Cảm ơn bạn trước!

+0

Tôi cũng có cùng một vấn đề. Có bất kỳ giải pháp bạn tìm thấy cho điều này? – user936414

Trả lời

1

có vẻ như với tôi rằng nó đã được thực hiện trên mục đích và tôi không biết tại sao. Có một số biến trong bools.xml

<bool name="action_bar_embed_tabs">true</bool> 
<bool name="action_bar_embed_tabs_pre_jb">false</bool> 

Chiều cao của các tab nhúng được giới hạn 48dip trong ActionBarPolicy.java, như bạn đã đề cập. Đó là lý do tại sao hành vi này chỉ có thể được nhìn thấy trong Android JellyBean trở lên. Tôi không thể tìm thấy một giải pháp tốt hơn để làm cho một số phản ánh java. Vì vậy, đây là mã số

private void hackJBPolicy() { 
    View container = findScrollingTabContainer(); 
    if (container == null) return; 

    try { 
     int height = getResources().getDimensionPixelSize(R.dimen.action_bar_height); 
     Method method = container.getClass() 
       .getDeclaredMethod("setContentHeight", Integer.TYPE); 
     method.invoke(container, height); 
    } catch (NoSuchMethodException e) { 
     Log.e(LOG_TAG, e.getLocalizedMessage(), e); 
    } catch (IllegalArgumentException e) { 
     Log.e(LOG_TAG, e.getLocalizedMessage(), e); 
    } catch (IllegalAccessException e) { 
     Log.e(LOG_TAG, e.getLocalizedMessage(), e); 
    } catch (InvocationTargetException e) { 
     Log.e(LOG_TAG, e.getLocalizedMessage(), e); 
    } 
} 

private View findScrollingTabContainer() { 
    View decor = getWindow().getDecorView(); 
    int containerId = getResources().getIdentifier("action_bar_container", "id", "android"); 

    // check if appcompat library is used 
    if (containerId == 0) { 
     containerId = R.id.action_bar_container; 
    } 

    FrameLayout container = (FrameLayout) decor.findViewById(containerId); 

    for (int i = 0; i < container.getChildCount(); i++) { 
     View scrolling = container.getChildAt(container.getChildCount() - 1); 
     String simpleName = scrolling.getClass().getSimpleName(); 
     if (simpleName.equals("ScrollingTabContainerView")) return scrolling; 
    } 

    return null; 
} 

Sử dụng phương pháp hackJBPolicy() trong số onCreate của bạn. Lưu ý rằng tôi đã sử dụng ActionBar từ thư viện appcompat. Đây là link cho dự án mẫu với việc sử dụng giải pháp này. Sau cùng, có vẻ như với tôi trong tương lai sẽ dễ dàng hơn khi tạo chế độ xem tùy chỉnh được căn chỉnh ở đầu màn hình thay vì sử dụng ActionBar trong chế độ tab nếu thiết kế ui của bạn hơi xa so với hướng dẫn.

+0

Bạn có thể giải thích cách thực hiện bằng cách sử dụng Thanh Hành động chuẩn, không hỗ trợ thư viện? Tôi không thể tìm thấy tài nguyên có tên R.id.action_bar_container. – user2302510

+0

Tôi biết đây là một nhận xét rất muộn nhưng tôi sẽ chấp nhận câu trả lời của st_, mặc dù nó sử dụng sự phản chiếu (về mặt lý thuyết làm chậm ứng dụng một chút). Nhưng anh ta cung cấp đầy đủ thông tin để người ta có thể hack theo cách của anh ấy qua "chính sách JB". Cuối cùng, tôi đã phát triển thanh tab tùy chỉnh của riêng mình, như st_ đã nói. – edy

26

Hãy thử đặt android:actionBarSizeactionBarSize dưới Theme bạn đang sử dụng, như vậy:

<style name="Theme.white_style" parent="@android:style/Theme.Holo.Light.DarkActionBar"> 
     <item name="android:actionBarSize">55dp</item> 
     <item name="actionBarSize">55dp</item> 
</style> 
+6

Điều này không hoạt động trên Jellybean. – Tomik

+1

Điều này hoạt động trên Jellybean. Tôi đã xác nhận nó trên Nexus 4 – Anton

+4

Vâng, nó thay đổi chiều cao của thanh tác vụ chính nhưng nó không ảnh hưởng đến chiều cao của thanh tab (chắc chắn không phải trên Android 4.2.2). – Tomik

9

Hãy thử sử dụng android:height như sau:

<style name="AppActionBar"> 
    <item name="android:height">50dp</item> 
</style> 

<style name="MainActivityStyle" parent="@android:style/Theme.Holo"> 
    <item name="android:actionBarStyle">@style/AppActionBar</item> 
</style> 
+1

hoạt động cho thanh tác vụ chia nhưng không cho thanh thứ hai/thanh xếp chồng (tab) – jfcartier

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