web-dev-qa-db-ja.com

互いに重なり合うフラグメント

3つのタブがあるアクションバーがあり、各タブでフラグメントが開きます。 3番目のタブ「カタログ」にはリストがあります。 enter image description here

アイテムをクリックすると、アクションバーの一部ではない別のフラグメントが開きます。

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;
        ...

その後は次のようになります。 enter image description here

この時点から、他のタブに移動してから[カタログ]タブに戻ると、前の2つのフラグメントが互いに重なり合っていることがわかります。

enter image description here

どうすればそれを防ぐことができますか?

19
Igal

タグで検索することでフラグメントを管理できます。バックスタックにフラグメントを追加する場合は、TAG名を追加します

transaction.addToBackStack("myCustomFragmentTag");

アプリケーションのどこかでフラグメントを破棄したい場合:

Fragment previousInstance = getFragmentManager().findFragmentByTag("myCustomFragmentTag");
                if (previousInstance != null)
                    transaction.remove(previousInstance);

このコード行が初期化された最後のフラグメントを破棄するように、いくつかの動作をオーバーライドしてみることができます

getFragmentManager().popBackStack(); 
4
Avicena00

背景をフラグメントレイアウトに設定すると、これが修正されます。

3
Asad Haider

この質問によると: Android:フラグメントの重複の問題

必要なのは、XMLファイルで背景色を設定することだけです。

この問題を解決します。

1
Milad Metias

あなたはタブのためにこのように試すことができます。

   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>
0
Make it Simple