2013-08-28 68 views
11

Làm cách nào để thay đổi chỉ báo tab đã chọn của thanh tác vụ của tôi? tôi đã đọc về tab styling, và Tab.setCustomView() phương pháp, nhưng không ai trong số những giúp:Có thể thay đổi chỉ báo tab của thanh tác vụ theo chương trình

  • Với phong cách tab, tôi có thể thay đổi màu chỉ thị, nhưng nó sẽ vẫn còn cho tất cả các tab (tôi muốn có một chỉ báo cho mỗi tab).

  • Với chế độ xem tùy chỉnh tab, tôi đã sử dụng bố cục có TextView cho tiêu đề tab và View để quản lý màu chỉ báo. Trong java tôi thay đổi nền của View một cách linh động, nhưng vấn đề là nền của View không khớp với các giới hạn của tab.

<TextView 
    android:id="@+id/custom_tab_text" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_centerInParent="true" 
    android:layout_centerHorizontal="true" 
    android:gravity="center|center_horizontal" 
    android:textStyle="bold"/> 

<View 
    android:id="@+id/custom_tab_view" 
    android:layout_width="match_parent" 
    android:layout_height="10dp" 
    android:layout_alignParentBottom="true"/> 

Ai đó có thể cho tôi biết nơi i'am sai? Có cách nào khác để làm điều đó không? Cảm ơn

+0

Ru sử dụng nền bố cục gốc của bạn làm android: backgrund = "@ drawable/tab_indicator" http://stackoverflow.com/q/3725692/1012284 –

+0

cố gắng sử dụng 'setLeftStripDrawable' và' setRightStripDrawable' –

+0

@PadmaKumar, tôi đã thử , nhưng giới hạn tab lớn hơn bố cục gốc của tôi. tôi đã thử cũng thiết lập 'padding và marigin' tại' 0dp' nhưng không có gì. –

Trả lời

16

tôi đã thành công để thực hiện những gì tôi muốn bằng cách sử dụng @ câu trả lời Padma để tạo nền chỉ số tab của tôi : tôi cần 5 bộ chọn: xanh lục, vàng, xanh dương, cam và đỏ. Vì vậy, tôi đã tạo ra 5 xml drawables (tabs_selector_red.xml, tabs_selector_blue.xml, etc...):

tabs_selector_green.xml:

<!-- Non focused states --> 
<item android:drawable="@android:color/transparent" android:state_focused="false" android:state_pressed="false" android:state_selected="false"/> 
<item android:drawable="@drawable/layer_bg_selected_tabs_green" android:state_focused="false" android:state_pressed="false" android:state_selected="true"/> 

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

<!-- Pressed --> 
<!-- Non focused states --> 
<item android:drawable="@android:color/transparent" android:state_focused="false" android:state_pressed="true" android:state_selected="false"/> 
<item android:drawable="@drawable/layer_bg_selected_tabs_green" android:state_focused="false" android:state_pressed="true" android:state_selected="true"/> 

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

Tôi cũng đã tạo ra một layer-list cho mỗi nền xml: layer_bg_selected_tabs_green.xml

<item> 
    <shape android:shape="rectangle" > 
     <solid android:color="@color/tab_green" /> 

     <padding android:bottom="5dp" /> 
    </shape> 
</item> 
<item> 
    <shape android:shape="rectangle" > 
     <solid android:color="#FFFFFF" /> 
    </shape> 
</item> 

Và cuối cùng, trong Java, tôi chuyển nền động mua sử dụng chọn tab của custom viewindex:

private static final int[] TABS_BACKGROUND = { 
     R.drawable.tabs_selector_orange, R.drawable.tabs_selector_green, 
     R.drawable.tabs_selector_red, R.drawable.tabs_selector_blue, 
     R.drawable.tabs_selector_yellow }; 
/* 
BLA BLA BLA 
*/ 
@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    // TODO Auto-generated method stub 
    RelativeLayout tabLayout = (RelativeLayout) tab.getCustomView(); 
    tabLayout.setBackgroundResource(TABS_BACKGROUND[tab.getPosition()]); 
    tab.setCustomView(tabLayout); 
/* ... */ 
} 

Bây giờ chúng ta hãy thêm một số ảnh chụp màn hình:

green blue red

+2

Như bạn thấy, 'chỉ báo' không khớp đúng với giới hạn của tab. Nếu ai đó có ý tưởng để giải quyết điều đó?! –

+0

Nhận Java.lang.NullPontException trên "tabLayout.setBackgroundResource (TABS_BACKGROUND [tab.getPosition()]);". – AndroidHacker

+0

'tabLayout' có thể là null, hãy đặt một câu hỏi khác với mã của bạn, chúng tôi sẽ xem có gì sai! –

5

// thanh tab của bạn nên được

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    style="@style/Wrap" 
    android:background="@drawable/tabs_selector" 
    android:gravity="center_horizontal|bottom" 
    android:minHeight="@dimen/size_fourty" 
    > 
    <TextView 
    android:id="@+id/custom_tab_text" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_centerInParent="true" 
    android:layout_centerHorizontal="true" 
    android:gravity="center|center_horizontal" 
    android:textStyle="bold"/> 

</RelativeLayout> 

// tabs_selector.xml bạn nên như thế này

<!-- Non focused states --> 
<item android:drawable="@drawable/layer_bg_unselected_tabs" android:state_focused="false" android:state_pressed="false" android:state_selected="false"/> 
<item android:drawable="@drawable/layer_bg_selected_tabs" android:state_focused="false" android:state_pressed="false" android:state_selected="true"/> 

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

<!-- Pressed --> 
<!-- Non focused states --> 
<item android:drawable="@drawable/layer_bg_unselected_tabs" android:state_focused="false" android:state_pressed="true" android:state_selected="false"/> 
<item android:drawable="@drawable/layer_bg_selected_tabs" android:state_focused="false" android:state_pressed="true" android:state_selected="true"/> 

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

// layer_bg_unselected_tabs của bạn nên được như thế này

<item> 
    <shape android:shape="rectangle" > 
     <solid android:color="@color/red" /> 

     <padding android:bottom="2dp" /> 
    </shape> 
</item> 
<item> 
    <shape android:shape="rectangle" > 
     <solid android:color="@color/gray" /> 
    </shape> 
</item> 

// layer_bg_selected_tabs của bạn nên được như thế này

<item> 
    <shape android:shape="rectangle" > 
     <solid android:color="@color/red" /> 

     <padding android:bottom="8dp" /> 
    </shape> 
</item> 
<item> 
    <shape android:shape="rectangle" > 
     <solid android:color="@color/gray" /> 
    </shape> 
</item> 

+0

cảm ơn nhưng nó không giải quyết hoàn toàn vấn đề của tôi. Tôi đã sử dụng nó để có các hình nền 'chỉ số' khác nhau (đỏ, lục, lam, v.v ...) nhưng tôi vẫn không thể thay đổi nó động trong mã. tôi đã cố gắng thay đổi bố cục bố cục gốc của tab đã chọn trong 'OnTabSelected' bằng cách sử dụng phương thức' setCustomView', nhưng điều đó có vẻ không hoạt động! –

+0

Làm thế nào màu đỏ, xanh lá cây, xanh lam sẽ cho biết tab bạn có thể chia sẻ màn hình của bạn như thế nào? –

+0

kiểm tra câu trả lời của tôi! –