2016-12-02 16 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); 
相关问题