2016-12-02 70 views
1

我在屏幕中有7個日期標籤,當選中標籤時,文本顏色爲黑色;而其他可選標籤則是白色的。如果日期落在另一個月份,我希望文本顏色爲灰色。通過編程方式將TabLayout中的標籤文本顏色更改爲不同顏色

我假定第一個選項卡是0,第二個標籤是1,並且繼續進行,直到6 如圖片,我想改變標籤(3)的文本顏色,標籤(4),選項卡(5)和標籤(6)。當它符合所需條件(不是xml)時,如何以編程方式完成這些操作,將這4個選項卡中的文本顏色設置爲灰色?

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" 
    android:paddingTop="8dp" 
    android:paddingBottom="8dp" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin"> 

    <TextView 
     android:id="@+id/lblWeekMsg" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/week" 
     android:textAppearance="?attr/textAppearanceListItem" /> 
    <TextView 
     android:id="@+id/lblWeekNo" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toEndOf="@id/lblWeekMsg" 
     android:layout_alignBaseline="@id/lblWeekMsg" 
     android:text="" 
     android:textAppearance="?attr/textAppearanceListItem" /> 

</RelativeLayout> 

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/coordinator_layout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight="30"> 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/app_bar_layout"> 

     <android.support.design.widget.TabLayout 
      android:id="@+id/tab_layout" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      app:tabTextColor="@android:color/white" 
      app:tabMode="scrollable" 
      app:tabGravity="fill" /> 

    </android.support.design.widget.AppBarLayout> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/view_pager" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

</android.support.design.widget.CoordinatorLayout> 

我用這樣的方式與片段創建標籤

public void setupViewPager(ViewPager viewPager, ArrayList<String> id, ArrayList<String> tasks, 
          ArrayList<Double> mondayHours, ArrayList<Double> tuesdayHours, 
          ArrayList<Double> wednesdayHours, ArrayList<Double> thursdayHours, 
          ArrayList<Double> fridayHours, ArrayList<Double> saturdayHours, 
          ArrayList<Double> sundayHours) { 
    Bundle bundle = new Bundle(); 
    bundle.putStringArrayList(EXTRA_CHECKED_TASK_ID, id); 
    bundle.putStringArrayList(EXTRA_CHECKED_TASKS, tasks); 
    bundle.putSerializable(EXTRA_MONDAY, mondayHours); 
    bundle.putSerializable(EXTRA_TUESDAY, tuesdayHours); 
    bundle.putSerializable(EXTRA_WEDNESDAY, wednesdayHours); 
    bundle.putSerializable(EXTRA_THURSDAY, thursdayHours); 
    bundle.putSerializable(EXTRA_FRIDAY, fridayHours); 
    bundle.putSerializable(EXTRA_SATURDAY, saturdayHours); 
    bundle.putSerializable(EXTRA_SUNDAY, sundayHours); 

    final String MON = "MON" + "\n" + MainActivity.sevenDatesList.get(0); 
    final String TUE = "TUE" + "\n" + MainActivity.sevenDatesList.get(1); 
    final String WED = "WED" + "\n" + MainActivity.sevenDatesList.get(2); 
    final String THU = "THU" + "\n" + MainActivity.sevenDatesList.get(3); 
    final String FRI = "FRI" + "\n" + MainActivity.sevenDatesList.get(4); 
    final String SAT = "SAT" + "\n" + MainActivity.sevenDatesList.get(5); 
    final String SUN = "SUN" + "\n" + MainActivity.sevenDatesList.get(6); 

    adapter = new ViewPagerAdapter(getSupportFragmentManager(), bundle); 
    adapter.addFragment(new MondayFragment(), MON); 
    adapter.addFragment(new TuesdayFragment(), TUE); 
    adapter.addFragment(new WednesdayFragment(), WED); 
    adapter.addFragment(new ThursdayFragment(), THU); 
    adapter.addFragment(new FridayFragment(), FRI); 
    adapter.addFragment(new SaturdayFragment(), SAT); 
    adapter.addFragment(new SundayFragment(), SUN); 

    viewPager.setAdapter(adapter); 
} 

我有TR ied this,但我的代碼沒有使用tabWidget。 我也試過this,但我的代碼並沒有使用tabHost。基於@Bhavesh Misri的建議

我的解決辦法:

ViewGroup vg = (ViewGroup) tabLayout.getChildAt(0); 
    //get number of tab 
    int tabsCount = vg.getChildCount(); 
    //loop the tab 
    for (int j = 0; j < tabsCount; j++) { 
     //get view of selected tab 
     ViewGroup vgTab = (ViewGroup) vg.getChildAt(j); 

     //when the day is not required to display - out of range 
     if(j<lesserThan || j>largerThan){ 
      //disable the selected tab 
      vgTab.setEnabled(false); 
      //set the not-required tab color transparent ratio 
      vgTab.setAlpha((float) 0.50); 
     } 
    } 
+0

如果可能,請在您初始化並填寫選項卡的位置發佈業務邏輯。 –

+0

@PravinD感謝提醒,我添加了代碼片段。 –

+0

您是否使用任何自定義佈局來呈現選項卡文本?另外,爲什麼要在適配器中使用自定義方法addFragment將片段添加爲FragmentPagerAdapter中的覆蓋getItem(int位置)以實現相同目的? –

回答

4

試試這個,讓我知道,如果這對你的作品:

tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 
      viewPager.setCurrentItem(tab.getPosition()); 
      if (tab.getPosition() == 0) { 
       tabLayout.getTabAt(0).getIcon().setAlpha(255); 
       tabLayout.getTabAt(1).getIcon().setAlpha(100); 
       tabLayout.getTabAt(2).getIcon().setAlpha(100); 
      } else if (tab.getPosition() == 1) { 
       tabLayout.getTabAt(0).getIcon().setAlpha(100); 
       tabLayout.getTabAt(1).getIcon().setAlpha(255); 
       tabLayout.getTabAt(2).getIcon().setAlpha(100); 

      } else if (tab.getPosition() == 2) { 
       tabLayout.getTabAt(0).getIcon().setAlpha(100); 
       tabLayout.getTabAt(1).getIcon().setAlpha(100); 
       tabLayout.getTabAt(2).getIcon().setAlpha(255); 

      } 
     } 

@Surya普拉卡什Kushawah用自己的方式爲好。

+0

爲我工作,謝謝。 – Dhruv

+0

@Dhruv歡迎 –

+0

您的tabLayout.getTabAt(0).getIcon()。setAlpha(100);給了我線索,非常感謝! –

2

創建style.xml風格和XML佈局一樣可以撥打下面

<style name="MyCustomTabLayout" parent="Widget.Design.TabLayout"> 

     <item name="tabIndicatorColor">@color/colorAccent</item> 
     <item name="tabIndicatorHeight">2dp</item> 
     <item name="tabTextAppearance">@style/MyCustomTabTextAppearance</item> 
     <item name="tabSelectedTextColor">@color/colorAccent</item> 
    </style> 

    <style name="MyCustomTabTextAppearance" parent="TextAppearance.Design.Tab"> 
     <item name="android:textSize">@dimen/title_text_size</item> 
     <item name="android:textColor">@color/secondaryText</item> 
     <item name="textAllCaps">false</item> 
     <item name="android:textStyle">normal</item> 
    </style> 

來電來訪

<android.support.design.widget.TabLayout 
       android:id="@+id/tab_layout" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       app:tabTextColor="@android:color/white" 
       app:tabMode="scrollable" 
     **style="@style/MyCustomTabLayout"** 
       app:tabGravity="fill" /> 
+0

我需要根據一定的條件改變文本顏色,所以我需要它以編程方式進行更改。 –

+0

然後你可以繼續http://stackoverflow.com/a/40928932/5209766 –

3

組標籤文字顏色是這樣的:

tabLayout.setTabTextColors(ContextCompat.getColorStateList(this, R.color.tab_selector)); 
tabLayout.setSelectedTabIndicatorColor(ContextCompat.getColor(this, R.color.indicator)); 
+0

謝謝。此代碼將更改整個TabLayout的文本顏色。我想要的是在符合條件時更改單個標籤文本顏色。 –

0

解決方案根據我上面的代碼:

ViewGroup vg = (ViewGroup) tabLayout.getChildAt(0); 
//get view of the 6th tab - start with zero 
ViewGroup vgTabSixth = (ViewGroup) vg.getChildAt(5); 
//set the not-required tab color transparent ratio 20% 
vgTabSixth.setAlpha((float) 0.20); 
相關問題