これは一種のばかげた問題であり、タブを追加および削除することは悪い考えです。フラグメントを使用している場合、そのタブを使用してフラグメントを削除および再追加することになります。カスタムビューを使用すると、はるかにうまく機能するようであり、追加のボーナスとして、より優れたカスタマイズが可能になります。
デフォルトのビューと同じように表示および動作するカスタムビューを使用してタブを作成する方法は次のとおりです。
ActionBar bar = getActionBar();
TabListener tabListener = new TabListener() {
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
};
Tab tab1 = bar.newTab()
.setText("Info")
.setTabListener(tabListener)
.setCustomView(makeTabDummy("Info", android.R.drawable.ic_menu_info_details));
bar.addTab(tab1);
これがピクセルパーフェクトダミービューです。
private TextView makeTabDummy(String text, int icon) {
TextView tv = new TextView(this);
tv.setText(text);
tv.setTextColor(0xffffffff);
tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18);
tv.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT));
tv.setCompoundDrawablesWithIntrinsicBounds(icon, 0, 0, 0);
tv.setGravity(Gravity.CENTER);
return tv;
}
ここから、タブのアイコンとテキストをまったく問題なく変更できます。例:
TextView tv = (TextView) tab1.getCustomView();
tv.setText("change the text!");
tv.setCompoundDrawablesWithIntrinsicBounds(android.R.drawable.btn_star_big_on, 0, 0, 0);
...そしてすべてが正常に機能します