Android タブアイコンの更新
-
09-06-2019 - |
質問
タブに表示される項目を含むリストビューを持つ TabSpec のセットを含む TabHost を持つアクティビティがあります。各TabSpec作成時にタブヘッダーに表示されるアイコンを設定します。
TabSpec はこの方法で setupTabs()
ループして適切な数のタブを作成するメソッド:
TabSpec ts = mTabs.newTabSpec("tab");
ts.setIndicator("TabTitle", iconResource);
ts.setContent(new TabHost.TabContentFactory(
{
public View createTabContent(String tag)
{
...
}
});
mTabs.addTab(ts);
プログラムの実行中に各タブに表示されるアイコンを変更できるようにしたい場合がいくつかあります。現在、すべてのタブを削除し、上記のコードを再度呼び出してタブを再作成しています。
mTabs.getTabWidget().removeAllViews();
mTabs.clearAllTabs(true);
setupTabs();
すべてのタブを削除して再作成せずに、表示されているアイコンを置き換える方法はありますか?
解決
簡単に言うと、何も欠けていないということです。Android SDK には、インジケーターを変更する直接的な方法が提供されていません。 TabHost
作成された後。の TabSpec
はタブを構築するためにのみ使用されるため、 TabSpec
事後では効果はありません。
ただし、回避策はあると思います。電話 mTabs.getTabWidget()
を得るために TabWidget
物体。これは単なるサブクラスです ViewGroup
, 、電話をかけることができます getChildCount()
そして getChildAt()
内の個々のタブにアクセスするには、 TabWidget
. 。これらの各タブはビューでもあり、グラフィカル インジケーターとテキスト ラベルを備えたタブの場合は、ほぼ確実に他のビューです。 ViewGroup
(たぶん LinearLayout
, 、でもそれは問題ではありません) ImageView
そして TextView
. 。そこで、デバッガを少しいじったり、 Log.i
, を入手するためのレシピを理解できるはずです。 ImageView
そしてそれを直接変更します。
欠点は、注意しないと、タブ内のコントロールの正確なレイアウトが変更され、アプリが破損する可能性があることです。最初のソリューションはおそらくより堅牢ですが、ちらつきやフォーカスの問題など、他の望ましくない副作用が発生する可能性があります。
他のヒント
ドミニクスの答えを確認するために、コードでの彼の解決策を次に示します(実際に機能します)。
tabHost.setOnTabChangedListener(new OnTabChangeListener() {
public void onTabChanged(String tabId) {
if (TAB_MAP.equals(tabId)) {
ImageView iv = (ImageView) tabHost.getTabWidget().getChildAt(0).findViewById(android.R.id.icon);
iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_map_black));
iv = (ImageView) tabHost.getTabWidget().getChildAt(1).findViewById(android.R.id.icon);
iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_list_white));
} else if (TAB_LIST.equals(tabId)) {
ImageView iv = (ImageView) tabHost.getTabWidget().getChildAt(0).findViewById(android.R.id.icon);
iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_map_white));
iv = (ImageView) tabHost.getTabWidget().getChildAt(1).findViewById(android.R.id.icon);
iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_list_black));
}
}
});
もちろん、まったく洗練されていませんし、getChildAt() でこれらの直接インデックスを使用するのはまったく良くありません...
少し遅いかもしれませんが、このスレッドを見ていただければ幸いです
http://groups.google.com/group/android-developers/browse_thread/thread/ef3bdebcb715b385
に関するコード例を含む私の投稿を参照してください カスタマイズされた Android タブ.
SPCTに感謝します
これは私がやったことであり、私にとってはうまくいきました。この関数は、TabBarActivity から拡張するアクティビティ内に作成しました。
public void updateTab(int stringID) {
ViewGroup identifyView = (ViewGroup)getTabWidget().getChildAt(0);
TextView v = (TextView)identifyView.getChildAt(identifyView.getChildCount() - 1);
v.setText(stringID);
}
この関数を変更してテキストの代わりに画像を変更することも、両方を変更することもできます。また、これを変更して任意のタブの子を取得することもできます。私は実行時に最初のタブのテキストを変更することに特に興味がありました。
この呼び出しを使用して、関連するアクティビティからこの関数を呼び出しました
getParent().updateTab(R.string.tab_bar_analyze);
これを試して:
tabHost.setOnTabChangedListener(new OnTabChangeListener() {
public void onTabChanged(String tabId) {
if (TAB_MAP.equals(tabId)) {
ImageView iv = (ImageView) tabHost.getTabWidget().getChildAt(0).findViewById(android.R.id.icon);
iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_map_black));
iv = (ImageView) tabHost.getTabWidget().getChildAt(1).findViewById(android.R.id.icon);
iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_list_white));
} else if (TAB_LIST.equals(tabId)) {
ImageView iv = (ImageView) tabHost.getTabWidget().getChildAt(0).findViewById(android.R.id.icon);
iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_map_white));
iv = (ImageView) tabHost.getTabWidget().getChildAt(1).findViewById(android.R.id.icon);
iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_list_black));
}
}
});