3つのタブがあるアクションバーがあり、各タブでフラグメントが開きます。 3番目のタブ「カタログ」にはリストがあります。
アイテムをクリックすると、アクションバーの一部ではない別のフラグメントが開きます。
public void onClick(View v) {
switch (v.getId())
{
case R.id.category1:
Fragment cosmeticsFragment = new ActivityCosmetics();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(Android.R.id.content, cosmeticsFragment);
transaction.addToBackStack(null);
transaction.setTransition(1);
transaction.commit();
break;
...
その後は次のようになります。
この時点から、他のタブに移動してから[カタログ]タブに戻ると、前の2つのフラグメントが互いに重なり合っていることがわかります。
どうすればそれを防ぐことができますか?
タグで検索することでフラグメントを管理できます。バックスタックにフラグメントを追加する場合は、TAG名を追加します
transaction.addToBackStack("myCustomFragmentTag");
アプリケーションのどこかでフラグメントを破棄したい場合:
Fragment previousInstance = getFragmentManager().findFragmentByTag("myCustomFragmentTag");
if (previousInstance != null)
transaction.remove(previousInstance);
このコード行が初期化された最後のフラグメントを破棄するように、いくつかの動作をオーバーライドしてみることができます
getFragmentManager().popBackStack();
背景をフラグメントレイアウトに設定すると、これが修正されます。
あなたはタブのためにこのように試すことができます。
public class Tabs extends TabActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_tabs); Resources res = getResources(); // Resource object to get Drawables TabHost tabHost = getTabHost(); // The activity TabHost TabHost.TabSpec spec; // Resusable TabSpec for each tab // Intent intent; // Reusable Intent for each tab // Create an Intent to launch an Activity for the tab (to be reused) Intent intent1 = new Intent().setClass(this, Social.class); // Initialize a TabSpec for each tab and add it to the TabHost spec = tabHost.newTabSpec("app_name").setIndicator("Practice", res.getDrawable(R.drawable.tab_social)) .setContent(intent1); tabHost.addTab(spec); tabHost.getTabWidget().getChildAt(0).setBackgroundResource(R.drawable.bbgg); // Do the same for the other tabs Intent intent2 = new Intent().setClass(this, Web.class); spec = tabHost.newTabSpec("application").setIndicator("Application", res.getDrawable(R.drawable.tab_web)) .setContent(intent2); tabHost.addTab(spec); tabHost.getTabWidget().getChildAt(1).setBackgroundResource(R.drawable.bbgg); Intent intent3 = new Intent().setClass(this, Catalog.class); spec = tabHost.newTabSpec("toplinks").setIndicator("Top Links", res.getDrawable(R.drawable.tab_catalog)) .setContent(intent3); tabHost.addTab(spec); tabHost.getTabWidget().getChildAt(2).setBackgroundResource(R.drawable.bbgg); tabHost.setCurrentTab(0); } }
レイアウトxmlで
<TabHost xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:id="@Android:id/tabhost" Android:layout_width="fill_parent" Android:layout_height="fill_parent" <LinearLayout Android:id="@+id/LinearLayout01" Android:layout_width="fill_parent" Android:layout_height="fill_parent" Android:orientation="vertical"> <TabWidget Android:id="@Android:id/tabs" Android:layout_width="fill_parent" Android:layout_height="wrap_content"></TabWidget> <FrameLayout Android:id="@Android:id/tabcontent" Android:layout_width="fill_parent" Android:layout_height="fill_parent"></FrameLayout> </LinearLayout> </TabHost>