2010-11-08 31 views
14

Tôi đang sử dụng các tab trong ứng dụng Android của tôi, và tôi đã chạy vào vấn đề này khi chạy các ứng dụng trên điện thoại HTC Sense:Tuỳ chỉnh phong cách dành cho Android của TabWidget

Android: Highlighted tab of TabWidget not readable on HTC Sense

Các giải pháp đề nghị đó (thiết lập android: targetSdkVersion to 4) không khắc phục được sự cố cho tôi, cũng không phải tôi muốn đặt sdk mục tiêu thành 4.

Tôi đã thử giải quyết vấn đề này bằng cách tạo kiểu widget tab của riêng mình và sửa đổi màu văn bản. Vấn đề là không có sự khác biệt đáng chú ý khi tôi sử dụng phong cách riêng của mình; tức là kiểu dường như không được áp dụng cho các tab.

Đây là mã cho các hoạt động chính, nắm giữ các tab:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.tab); 

    tabHost = getTabHost(); 
    tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("Tab 1").setContent(new Intent(this, Tab1.class))); 
    tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("Tab 2").setContent(new Intent(this, Tab2.class))); 

    tabHost.setCurrentTab(0); 
} 

Đây là tab.xml tôi. Chú ý rằng tôi đã xác định MyTabStyle như phong cách cho TabWidget:

<?xml version="1.0" encoding="utf-8"?> 
<TabHost xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/tabhost" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:padding="5dp"> 
     <TabWidget 
      style="@style/MyTabStyle" 
      android:id="@android:id/tabs" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" /> 
     <FrameLayout 
      android:id="@android:id/tabcontent" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:padding="5dp" /> 
    </LinearLayout> 
</TabHost> 

Và đây là định nghĩa của tôi về MyTabStyle, mà tôi đã xác định trong res/values ​​/ styles.xml:

<style name="MyTabStyle" parent="@android:style/TextAppearance.Widget.TabWidget"> 
    <item name="android:textColor">#5DFC0A</item> 
</style> 

Tại sao không có thay đổi trong MyTabStyle hiển thị trong ứng dụng của tôi? Bất kỳ giải pháp nào khác để giải quyết văn bản ẩn trên các tab đã chọn trong HTC Sense?

CẬP NHẬT 2011-06-02

tôi quản lý để giải quyết việc này trong một loại cách hacky, bằng cách sử dụng sự hiểu biết rằng các văn bản trên các tab đang thực sự TextView. Thêm phương pháp sau đây để hoạt động của bạn:

private void setTabColor(TabHost tabHost) { 
    try { 
     for (int i=0; i < tabHost.getTabWidget().getChildCount();i++) { 
      TextView tv = (TextView) tabHost.getTabWidget().getChildAt(i).findViewById(android.R.id.title); //Unselected Tabs 
      if (tv != null) { 
       tv.setTextColor(Color.parseColor("#ffffff")); 
      } 
      TextView tv2 = (TextView) tabHost.getCurrentTabView().findViewById(android.R.id.title); // Selected Tab 
      if (tv2 != null) { 
       tv2.setTextColor(Color.parseColor("#000000")); 
      } 
     } 
    } catch (ClassCastException e) { 
     // A precaution, in case Google changes from a TextView on the tabs. 
    } 
} 

Thêm dòng sau trong phương pháp của bạn onCreate() trong hoạt động của bạn:

// Only apply the fix if this is a HTC device. 
if (android.os.Build.MANUFACTURER.toLowerCase().contains("htc")) { 
    // Set up the color initially 
    setTabColor(tabHost); 

    // Add a tab change listener, which calls a method that sets the text color. 
    tabHost.setOnTabChangedListener(new OnTabChangeListener() { 
     public void onTabChanged(String tabId) { 
      InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
      imm.hideSoftInputFromWindow(tabHost.getApplicationWindowToken(), 0); 
      setTabColor(tabHost); 
     } 
    }); 
} 
+0

Có liên quan, nhưng không chính xác là trùng lặp, nhưng có câu trả lời hay hơn (mới hơn?) Để biết cách tạo kiểu TabWidget: http://stackoverflow.com/a/2805256/2291 –

Trả lời

-6

<!-- Focused states --> 
<item android:state_focused="true" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/tab_focus" /> 
<item android:state_focused="true" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/tab_focus" /> 

<!-- Pressed --> 
<item android:state_pressed="true" android:drawable="@drawable/tab_press" /> 

+9

Cách này trả lời câu hỏi của tôi? – gizero

+1

@gizero Câu trả lời này được chấp nhận như thế nào? :) – hendrix

+0

Vì đây là cách bạn tạo kiểu cho Tab. – Ajibola

11

Anh chàng này đã đăng một cách để tùy chỉnh mọi thứ về tab khá nhiều. Hoạt động với Android 1.6 trở lên: Custom Android Tabs.

Tôi chưa thử, nhưng đến đó. Về cơ bản bạn gọi setIndicator trên TabSpec của bạn và chuyển nó một cái nhìn thay vì chỉ văn bản. Sau đó, bạn có thể tùy chỉnh chế độ xem đó bằng cách sử dụng các bộ chọn, v.v.

+0

nhưng thật đáng buồn bạn vẫn sẽ cần ít nhất sdk4 min cho việc này. – Fraggle

+34

"Anh chàng này" là tôi. –

2

Nếu bạn vẫn đang sử dụng TabWidgets trên> 14, xem http://code.google.com/p/android/issues/detail?id=2267. Nhận xét cuối cùng trỏ đến iosched2011 và thực sự ở đó họ thay thế toàn bộ khung nhìn cho TabIndicator. Ngoại trừ một vài thuộc tính (nền chung, văn bản), bất kỳ cách đơn giản nào cũng có vẻ bị hỏng và sự phức tạp này là bắt buộc.