Facebook 앱과 같이 탭 아이콘의 색상을 변경하고 싶습니다.PageChangeListener로 탭 아이콘의 색상을 동적으로 변경하십시오.
ViewPager
의 상태가 SCROLL_STATE_DRAGGING
이며, 모든 아이콘 변경 '때 ViewPager
의 상태가 SCROLL_STATE_SETTLING
및 SCROLL_STATE_IDLE
때 다른 한편으로는, 선택되지 않은 (회색) 색상에 색상을, 다음, 선택 (흰색에 선택한 탭의 아이콘을 변경할) 색깔.
테스트를 수행했습니다. 현재 선택된 조각을 다른 조각으로 스크롤하지만 여전히 SCROLL_STATE_DRAGGING
상태를 유지합니다.
이상한 상황에서 에뮬레이터에서 앱을 실행했는데 완벽하게 작동하는 것 같습니다. 실제 기기에서 앱을 실행하면 ViewPager
상태 일 때 선택한 탭의 색상이 흰색으로 변경되지 않았습니다. SCROLL_STATE_IDLE
또는 SCROLL_STATE_SETTLING
addOnPageChangeListener
에서 ViewPager
까지를 추가했으며 각기 다른 색으로 변경되었습니다.
팁이 있습니까?
void setupViews() {
mViewPager = (ViewPager) findViewById(R.id.container);
tabLayout = (TabLayout) findViewById(R.id.tabLayout);
colorSelected = ContextCompat.getColor(ctx, R.color.itemSelected);//white
colorUnselected = ContextCompat.getColor(ctx, R.color.itemUnselected);//gray
pagerIcons = new Drawable[2];
pagerIcons[0] = DrawableCompat.wrap(VectorDrawableCompat.create(ctx.getResources(), R.drawable.ic_list_black_24dp, null));
pagerIcons[1] = DrawableCompat.wrap(VectorDrawableCompat.create(ctx.getResources(), R.drawable.ic_shopping_cart_black_24dp, null));
ViewPagerHelper.TabOption option = new ViewPagerHelper.TabOption(true, true);
helper = new ViewPagerHelper(getSupportFragmentManager(), mViewPager, tabLayout, option);
helper.bindViewPager();
helper.addFragmentWithTabIcon(new ExpenseIncomeFragment(), pagerIcons[0], ExpenseIncomeFragment.TAG);
helper.addFragmentWithTabIcon(new FragmentWishList(), pagerIcons[1], FragmentWishList.TAG);
mViewPager.setScrollbarFadingEnabled(true);
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
//if (positionOffset>0)DrawableCompat.setTint(pagerIcons[mViewPager.getCurrentItem()], colorUnselected);
Log.e("MainActivity","position="+position+"
positionOffset="+positionOffset+" positionOffsetPixels="+positionOffsetPixels);
}
@Override
public void onPageSelected(int position) {
Log.e("MainActivity","position="+position);
pagerIcons[mViewPager.getCurrentItem()].setColorFilter(colorSelected, PorterDuff.Mode.SRC_IN);
}
@Override
public void onPageScrollStateChanged(int state) {
int pos = mViewPager.getCurrentItem();
switch (state) {
case ViewPager.SCROLL_STATE_IDLE:
Log.e("MainActivity","SCROLL_STATE_IDLE" + " getCurrentItem="+pos);
pagerIcons[pos].setColorFilter(colorSelected, PorterDuff.Mode.SRC_IN);
break;
case ViewPager.SCROLL_STATE_DRAGGING:
Log.e("MainActivity","SCROLL_STATE_DRAGGING" + " getCurrentItem="+pos);
pagerIcons[pos].setColorFilter(colorUnselected, PorterDuff.Mode.SRC_IN);
break;
case ViewPager.SCROLL_STATE_SETTLING:
Log.e("MainActivity","SCROLL_STATE_SETTLING" + " getCurrentItem="+pos);
pagerIcons[pos].setColorFilter(colorSelected, PorterDuff.Mode.SRC_IN);
break;
}
}
});
helper.update();
mViewPager.setCurrentItem(0);
int len = pagerIcons.length;
for (int i = 0; i < len; i++) {
pagerIcons[i].setColorFilter(colorUnselected,
PorterDuff.Mode.SRC_IN);
}
pagerIcons[0].setColorFilter(colorSelected,PorterDuff.Mode.SRC_IN);
});
}
클래스 ViewPagerHelper
이 TabLayout
에 ViewPager
을 결합하는 데 사용됩니다
여기 내 코드입니다. pagerIcons
은 탭 아이콘의 드로어 블이며 색상을 채색합니다.
답변 해 주셔서 감사합니다. 색상 선택기 XML을 사용하여 처음으로 벡터 드로어 블 XML에 직접 넣었습니다. 그러나 위의 솔루션을 사용하는 경우 제 경우에는 FloatActionButton의 아이콘과 같이 다른 용도로 벡터 드로어 블을 필요로하므로 드로어 블을 복제해야합니다 (선택기 섹션 코드 삭제). 아니면 그것에 대해 생각해 보시겠습니까? 그런데 다시 해결책을 가져 주셔서 감사합니다. 나는이 대답을 올렸다. :) – cmingmai
개인적으로 단순히 벡터 드로어 블 파일을 복제하고 다른 색상을 사용합니다.일반적으로 콘텐츠가 동일한 경우 여러 위치에서 자원 만 재사용합니다. 즉, 탭과 FAB은 우연히 동일한 아이콘을 사용합니까, 아니면 항상 동일한 아이콘을 사용합니까 (하나를 변경하면 항상 다른 아이콘을 변경하게됩니까)? 그럼에도 불구하고 xml을 복제하여 색상을 변경하는 것은 결코 무리가 아닙니다. 다른 옵션은 Java에서 프로그래밍 방식으로 그 중 하나를 색칠하는 것입니다. –