TabLayout의 Tab에 다른 Indicator 색상을 설정하고 싶습니다.

14845 단어 Android

2015/8/27 추기

  • Android Support Library 23에 TabLayout#s t SelectedTabIndicator Color를 준비했습니다.
  • 하고 싶은 일


  • Design Support Library를 사용한 TabLayout
  • 각 탭의 표시기 색상을 변경하려면
  • 예: Tab1의 표시자: 빨간색
  • Tab2의 표시기: 파란색
  • 문제.


    TabLayout의 표시기 색상 설정 방법

  • XML에서 app:tabIndicator Color로 설정하면 되지만 이것만 있으면 모든 탭의 표시기 색깔이 하나가 됩니다.
  • 
    <android.support.design.widget.TabLayout
            android:id="@+id/sliding_tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabIndicatorColor="@color/hoge_color" />
    

    해결책

  • Android Design Support Library 23에서 제공하는 세터를 사용하면 k
  • NewAndroidLibrary.java
    mTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
                @Override
                public void onTabSelected(TabLayout.Tab tab) {
                    switch (tab.getPosition()) {
                        case 0:
                            mTabLayout.setSelectedTabIndicatorColor(getResources().getColor(R.color.blue));
                            break;
                        case 1:
                            mTabLayout.setSelectedTabIndicatorColor(getResources().getColor(R.color.red));
                            break;
                        case 2:
                            mTabLayout.setSelectedTabIndicatorColor(getResources().getColor(R.color.green));
                            break;
                        default:
                            break;
                    }
                }
    
                @Override
                public void onTabUnselected(TabLayout.Tab tab) {
    
                }
    
                @Override
                public void onTabReselected(TabLayout.Tab tab) {
    
                }
            });
    

    소스 코드의 제한 사항

  • Android Design Support Library의 TabLayout은 다음과 같다. 언뜻 보면 표시기 색상을 자유롭게 설정할 수 있을 것 같지만 mTabStrip은 prive의 멤버 변수로 Getter도 없는 것 같다....
  • 위의 내용은 Android Support Library 23을 통해 해결되었습니다
  • .
    TabLayout.class
    public TabLayout(Context context, AttributeSet attrs, int defStyleAttr) {
    //----略-----
            this.mTabStrip = new TabLayout.SlidingTabStrip(context);        
         this.mTabStrip.setSelectedIndicatorColor(a.getColor(styleable.TabLayout_tabIndicatorColor, 0));
    //----略-----
    

    해결


    초경성

  • 안드로이드 Design Support Library 23과에서 인디케이터 Color에 대한 2차 패스를 준비했다. 다음은 deprecated
  • deprecated.java
    mTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
                @Override
                public void onTabSelected(TabLayout.Tab tab) {
                    if (tab.getPosition() == 0) {
                        changeTabIndicatorColor(getResources().getColor(R.color.transaction_out_color));
                    } else if (tab.getPosition() == 1) {
                        changeTabIndicatorColor(getResources().getColor(R.color.transaction_in_color));
                    } else if (tab.getPosition() == 2) {
                        changeTabIndicatorColor(getResources().getColor(R.color.transaction_ex_color));
                    }
    
                    viewPager.setCurrentItem(tab.getPosition(), false); // タブ内のページも切り替えないといけない。
                }
    
                @Override
                public void onTabUnselected(TabLayout.Tab tab) {
    
                }
    
                @Override
                public void onTabReselected(TabLayout.Tab tab) {
    
                }
            });
    
    private void changeTabIndicatorColor(int colorIdInHex) {
            try {
                Field field = TabLayout.class.getDeclaredField("mTabStrip");
                field.setAccessible(true);
                Object ob = field.get(mTabLayout);
                Class<?> c = Class.forName("android.support.design.widget.TabLayout$SlidingTabStrip");
                Method method = c.getDeclaredMethod("setSelectedIndicatorColor", int.class);
                method.setAccessible(true);
                method.invoke(ob, colorIdInHex);
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    
  • 강행...더 똑똑한 방법이 있을 거야...
  • 근데 아직 못 찾았어 (눈물
  • 인용하다

  • http://stackoverflow.com/questions/30904138/how-to-change-the-new-tablayout-indicator-color-and-height
  • 좋은 웹페이지 즐겨찾기