Androidの新しいサポートTabLayoutを使用しています。問題は、タブを選択したときにセレクターを使用してアイコンを変更したかったことです。
私はソースコードを調査してきましたが、ビューの状態を変更することは決してないようです(そのため、セレクタを使用できません)。
誰かがいくつかの回避策を知っていますか?
ありがとうございました!
setCustomView(View view) メソッドを使用して、customViewをタブとして設定する方法があります。そのため、textviewを作成してセレクターを設定し、このビューをタブに設定できます。
お役に立てば幸いです。
My_selector.xmlが、
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@drawable/icon_on" Android:state_selected="true"/>
<item Android:drawable="@drawable/icon_off"/> <!-- default -->
</selector>
次に、setIconを直接呼び出すことができます。
tab.setIcon(R.drawable.my_selector);
「com.Android.support:design:22.2.0」で確認済み。
TabLayoutの各タブのカスタムビューを最初に設定するときに、最初のタブ(インデックス0)を選択済みに設定する必要があることがわかりました。
TabLayout toolbarTabLayout = (TabLayout) findViewById(R.id.tabs);
toolbarTabLayout.setupWithViewPager(mViewPager);
toolbarTabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
toolbarTabLayout.setTabMode(TabLayout.MODE_FIXED);
toolbarTabLayout.setTabTextColors(R.color.colorPrimary, R.color.white);
// Iterate over all tabs and set the custom view
for (int i = 0; i < toolbarTabLayout.getTabCount(); i++) {
TabLayout.Tab tab = toolbarTabLayout.getTabAt(i);
View v=mSectionsPagerAdapter.getTabView(i);
// no tabs are actually selected at start, this will make sure the
// selector for the colors comes in right when initialized
if (i==0)
v.setSelected(true);
tab.setCustomView(v);
}
これにより、カスタムビューが適用されたときに最初のタブが強制的に選択されたように見えます。それは本当にハックのように感じられます。うまくいけば、他の誰かが本当の問題を理解し、より良い修正を提案してくれるでしょう。
これは私のために働いたものです:
セレクターが描画可能なresフォルダーに設定されていると仮定します(上記の Xingang Huang など)。 MainActivity(TabLayoutをセットアップする場所)に、アイコンセレクターの配列を含め、次のようにループします。
for (int i = 0; i < yourTabLayout.getTabCount(); i++) {
ImageView imageView = new ImageView(this); //your context, in this case MainActivity.class
imageView.setImageResource(arr_tabIcons[i]); //tabIcons is the array of icons
if (i==0) {
imageView.setSelected(true);
}
yourTabLayout.getTabAt(i).setCustomView(imageView);
}
tab.setIcon(R.drawable.icon)
同様に機能しますが、私の場合、アイコンは非常に小さく見えたので、ソリューションをImageViewと併用してタブビューを埋める必要がありました。
幸せなコーディング;)
あなたがすべてを正しく行ったなら(そして私はこれを信じる)、あなたは私と同じ時点に到着した。多分それは新しいAndroid appcompatライブラリの小さなバグです。
この問題を解決するための回避策(良いポルトガル語ではGambiarraと呼ばれています)を見つけました。次のように、Tabクラスからメソッドselect()を呼び出す必要があります。
mTabLayout.getTabAt(x).select();
ただし、非常に重要です。x変数は、現在選択されているタブインデックスとは異なる必要があります。