Facebookアプリのようにタブアイコンの色を変更したいと思います。 ViewPager
の状態がSCROLL_STATE_SETTLING
とSCROLL_STATE_IDLE
ときPageChangeListenerでタブアイコンの色を動的に変更する
ViewPager
とき選択されていない(灰色)色に色の状態がSCROLL_STATE_DRAGGING
あり、すべてのアイコンを変更 'は、他方で、次いで選択された(白に選択されたタブのアイコンを変更します) 色。
私はテストを行いました:現在選択されているフラグメントを他のフラグメントにスクロールしますが、まだ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を使用して、初めてベクトルdrawables xmlに直接挿入しました。しかし、私の場合は、上記のソリューションを使用する場合は、Drawableをコピーする必要があります(セレクタセクションのコードを削除する必要があります)ので、他の用途、つまりFloatActionButtonのアイコンのためのベクトル描画可能ファイルが必要です。それとも、あなたはそれについて考えていますか?ところで、このソリューションにもう一度感謝します。私はこの答えを上げました。 :) – cmingmai
個人的に、私は単純にベクトル描画可能ファイルを複製し、異なる色を使用します。一般的に、私は、コンテンツが同一の場合、複数の場所でリソースを再利用するだけです。言い換えれば、あなたのタブとあなたのFABは同じアイコンを偶然に使っているのですか、あるいはいつも同じアイコンを使いますか?それでも色を変更するためにxmlを複製することは、全く不合理ではありません。唯一の他の選択肢は、Javaでプログラム的にそれらの1つを色づけることです。 –