Пользовательский выбранный цвет текста вкладки в SlidingTabLayout

Я использую SlidingTabLayout из google ( https://developer.android.com/samples/SlidingTabsBasic/src/com.example.android.common/view/SlidingTabLayout.html ).

Он работает хорошо, но я хочу, чтобы выделенный выделенный текст выделен жирным шрифтом и с другим цветом …

Относительно этого сообщения: Пользовательский невыбранный цвет текста вкладки в SlidingTabLayout

Я делаю text_tab.xml в drawable с селектором:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="@android:color/selected" android:state_selected="true" /> <item android:color="@android:color/unselected" /> </selector> 

Когда в методе populateTabStrip () я помещаю

  tabTitleView.setTextColor(getResources().getColorStateList(R.drawable.text_tab)); 

Цвет всегда является невыбранным …

Я, вероятно, что-то делаю неправильно, или, возможно, есть другой способ настроить выбранный заголовок табуляции.

У кого-то есть идея?

благодаря

Solutions Collecting From Web of "Пользовательский выбранный цвет текста вкладки в SlidingTabLayout"

Проблема заключается в том, что скользящая компоновка не устанавливает состояние элемента как selected . Вот мой подход к решению проблемы.

1) Создайте селектор COLOR ( ColorStateList ) для просмотра. Вы можете представить это так:

/res/color/tab_text_color.xml :

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="@color/white" android:state_selected="true"/> <item android:color="@color/black"/> </selector> 

2) Поместите созданный селектор в свой элемент textColor (или другой необходимый атрибут):

 <TextView ... android:textColor="@color/tab_text_color" ... /> 

3) Внесение изменений в файл SlidingTabLayout.java:

 View oldSelection = null; // new field indicating old selected item // method to remove `selected` state from old one private void removeOldSelection() { if(oldSelection != null) { oldSelection.setSelected(false); } } // improve method scrollToTab() as follows private void scrollToTab(int tabIndex, int positionOffset) { final int tabStripChildCount = mTabStrip.getChildCount(); if (tabStripChildCount == 0 || tabIndex < 0 || tabIndex >= tabStripChildCount) { return; } View selectedChild = mTabStrip.getChildAt(tabIndex); if (selectedChild != null) { if(positionOffset == 0 && selectedChild != oldSelection) { // added part selectedChild.setSelected(true); removeOldSelection(); oldSelection = selectedChild; } int targetScrollX = selectedChild.getLeft() + positionOffset; if (tabIndex > 0 || positionOffset > 0) { // If we're not at the first child and are mid-scroll, make sure we obey the offset targetScrollX -= mTitleOffset; } scrollTo(targetScrollX, 0); } } private void populateTabStrip() { removeOldSelection(); // add those two lines oldSelection = null; ... } 

1) Прежде всего создайте папку цвета под res (/ res / color)
2) создать xml-файл selector.xml под папкой / res / color

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="true" android:color="@android:color/white" /> <item android:state_focused="true" android:color="@android:color/white" /> <item android:state_pressed="true" android:color="@android:color/white" /> <item android:color="#504f4f" /> </selector> 

3) Затем в методе populateTabStrip () в SlidingTabLayout поместите это

 tabTitleView.setTextColor(getResources().getColorStateList(R.color.selector)); 

Теперь у вас есть селектор, и вы можете изменить цвет текста на любом событии, которое вы хотите

Если это не работает, добавьте следующие строки кода.
A) в методе populateTabStrip () в конце добавить это

 if (i == mViewPager.getCurrentItem()) { tabView.setSelected(true); } 

И b) изменить метод onPageSelected () на это

  @Override public void onPageSelected(int position) { if (mScrollState == ViewPager.SCROLL_STATE_IDLE) { mTabStrip.onViewPagerPageChanged(position, 0f); scrollToTab(position, 0); } for (int i = 0; i < mTabStrip.getChildCount(); i++) { mTabStrip.getChildAt(i).setSelected(position == i); } if (mViewPagerPageChangeListener != null) { mViewPagerPageChangeListener.onPageSelected(position); } } 

У меня была аналогичная проблема, но я использовал собственный заголовок страницы View с иконкой и текстом. Чтобы установить пользовательские цвета, когда вкладка выбрана / не выбрана, я использовал селектор, созданный @PanayiotisIrakleous, поэтому большое спасибо ему за его публикацию.

Вот как я это сделал: –

1- Создайте xml-файл для селектора. Я сделал файл, slidingtab_title_color.xml и поместил его в папку Drawable .

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="true" android:color="@android:color/white" /> <item android:state_focused="true" android:color="@android:color/white" /> <item android:state_pressed="true" android:color="@android:color/white" /> <item android:color="#504f4f" /> </selector> 

2- Откройте свой собственный макет для заголовка вкладки и добавьте файл selector в атрибут android:textColor . Мой пользовательский файл имеет имя slidingtab_title_color.xml и имеет следующий код-

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="10dp" android:background="@drawable/ripple_effect"> <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <!--Adding the selector file in textColor attribute--> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Text" android:textColor="@drawable/slidingtab_title_color"/> </LinearLayout> 

3- (Необязательно) Если вы хотите изменить цвет индикатора и фон скользящей вкладки, добавьте следующую строку в файл, где вы инициализируете свой SlidingTabLayout

 mSlidingTab.setBackgroundColor(getResources().getColor(R.color.primaryColor)); mSlidingTab.setSelectedIndicatorColors(getResources().getColor(R.color.accentColor)); 

Просто убедитесь, что вы добавляете эти строки, прежде чем устанавливать ViewPager для SlidingTabLayout .

Вот и все, вот как это будет выглядеть. SlidingTab с переключателем вкладок

Для тех, у кого все еще есть проблемы, вот ссылка битбакет для источника проекта и эта ссылка для всех проектов по материальному дизайну.

В случае, если кто-то заинтересован в другом решении без использования файла ресурсов XML Selector, вот почему-то на основе ответа @Panayiotis.

Добавьте приведенные ниже методы в класс SlidingTabStrip.java :

 public void setTabTitlesTextColor(int selectedPosition) { for (int i = 0; i < getChildCount(); i++) { if (TextView.class.isInstance(getChildAt(i))) { ((TextView) getChildAt(i)).setTextColor((selectedPosition == i) ? getTabColorizer().getIndicatorColor(i) : Color.argb(90, 0,0,0) ); } } } public SlidingTabLayout.TabColorizer getTabColorizer() { if (mCustomTabColorizer != null) return mCustomTabColorizer; else return mDefaultTabColorizer; } 

Вызовите вновь созданный метод setTabTitlesTextColor () в onPageSelected и setViewPager в классе SlidingTabLayout.java, как показано ниже:

 public void setViewPager(ViewPager viewPager) { mTabStrip.removeAllViews(); mViewPager = viewPager; if (viewPager != null) { viewPager.setOnPageChangeListener(new InternalViewPagerListener()); populateTabStrip(); mTabStrip.setTabTitlesTextColor(viewPager.getCurrentItem()); } } @Override public void onPageSelected(int position) { if (mScrollState == ViewPager.SCROLL_STATE_IDLE) { mTabStrip.onViewPagerPageChanged(position, 0f); scrollToTab(position, 0); } mTabStrip.setTabTitlesTextColor(position); if (mViewPagerPageChangeListener != null) { mViewPagerPageChangeListener.onPageSelected(position); } } 

Я создал функцию

 private void setTabTextSelected(TextView textView, boolean selected){ if (selected){ textView.setTextColor(getResources().getColor(R.color.Black)); textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); } else{ textView.setTextColor(getResources().getColor(R.color.ColorPrimaryDark)); textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 13); } } 

И назвал его двумя функциями в SlidingTabLayout:

  1. В конце populateTabStrip:
 setTabTextSelected(tabTitleView, i == mViewPager.getCurrentItem()); 
  1. At onPageSelected:
 for (int i = 0; i < mTabStrip.getChildCount(); i++) { TextView textView = (TextView) mTabStrip.getChildAt(i); setTabTextSelected(textView, position == i); } 

Попробуйте этот фрагмент кода в методе onCreate ().

 tabTitleView.setTabTextColors( getResources().getColor(R.color.active), getResources().getColor(R.color.inactive));