2015-09-23 82 views
2

我有一個帶有ViewPager的TabLayout。 ViewPager有四個片段F1,F2,F3和F4。 F1包含一個FrameLayout,它可以有兩個片段F11和F12。最初我用下面的代碼在FrameLayout中添加F11。上一個片段在新片段下方可見

Fragment11 fragment11 = new Fragment11(); 
fragment11.setArguments(getActivity().getIntent().getExtras()); 
getActivity().getSupportFragmentManager().beginTransaction() 
       .add(R.id.fragment_container, fragment11, Constants.FRAGMENT_11) 
       .commit(); 

F11包含一個ListView。當我點擊這個ListView中的任何項目/行時,F11被替換爲F12。 F12是一個細節片段。

Fragment12 fragment12 = new Fragment12(); 
FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction(); 
fragmentTransaction.replace(R.id.fragment_container, fragment12, Constants.FRAGMENT_12) 
        .addToBackStack(null) 
        .commit(); 

對於正常的應用程序流程,它工作正常。現在假設我現在在Fragment12中,並且我按下了主頁按鈕。現在我打開任何沉重的應用程序(相機或任何其他應用程序)來從內存中刪除我的應用程序現在我又開始了我的應用程序。

現在有兩個Fragment11和一個Fragment12是可見的,所有在同一時間。當我按回Fragment12被刪除,現在兩個Fragment11可見。當我點擊Fragment11的ListView行時,頂部的Fragment11被Fragment12取代,但是底部的Fragment11仍然存在。

這就是我想要的: 當應用程序從背景來到前景時,Fragment12應該是可見的,當我按回Fragment12應該彈出顯示Fragment11。

我該怎麼做?

+0

在添加這兩個嵌套片段時,您可能需要使用正確的FragmentManager,getChildFragmentManager()。 – Luksprog

+0

@Luksprog如果我使用getChildFragmentManager()代替,我找不到R.id.fragment_container。它的例外。 java.lang.IllegalArgumentException:沒有找到id爲0x7f0e014c(com.demo:id/fragment_container)的片段Fragment12 –

+1

如果這些片段在另一個片段的佈局中使用,那麼您需要使用getChildFragmentManager()。如果你得到這個錯誤,你在代碼/佈局中做錯了什麼。你沒有發佈太多的代碼,但另一個問題是,如果你有**檢查**,F11和F12在getChildFragmentManager()中可用,然後再將它們添加到佈局中(或者在每次添加時盲目添加這些碎片使用當前代碼構造父項的實例? – Luksprog

回答

0

我面臨同樣的問題。但我也無法找到適當的解決方案。在我的場景中,當我打開多個應用程序並且他們回到我的應用程序時,它會導致碎片發生在您身邊的相同問題。但我讓我的應用程序穩定。我已經通過了以下解決方案做到了這一點:

  1. 當你的應用從內存中刪除,然後再次打開該應用程序,然後叫你的MainActivity中,你都呈現片段的onCreate()方法。

  2. 這裏我檢查了backstackEntrycount,如果它大於0,則刪除所有片段並顯示基片段。

    // Clear all fragments and show base fragment, So it will not create 
    // issue after opening 
    // multiple apps 
    FrameLayout flSliding = (FrameLayout) findViewById(R.id.fl_sliding); 
    flSliding.post(new Runnable() { 
    
        @Override 
        public void run() { 
         FragmentManager fragmentManager = getSupportFragmentManager(); 
         Log.i("NavigationDrawerActivity", 
           "onCreate " + fragmentManager.getBackStackEntryCount()); 
         if (fragmentManager.getBackStackEntryCount() > 0) { 
          removeFragment(fragmentManager.getBackStackEntryCount()); 
         } 
         Log.i("NavigationDrawerActivity", 
           "onCreate " + fragmentManager.getBackStackEntryCount()); 
        } 
    }); 
    

希望這將有助於!

+0

上面的代碼並沒有幫助我。當應用程序再次啓動時,可以看到三個片段F11,F11和F12。當我使用你的代碼時,可以看到兩個碎片,F11和F11。我不明白髮生了什麼事。Gmail應用程序解決了同樣的問題。 Gmail有兩個片段,郵件列表和詳細信息。當我從細節片段關閉應用程序後,再次來到應用程序後顯示細節片段,而不是電子郵件列表。他們是如何處理的? –

8

我知道這太遲了,但這個答案可以幫助別人。這不是一個合適的解決方案,但它爲我工作。因此,在你的片段的根視圖中放入android:clickable="true"android:background="?android:attr/colorBackground"。希望這會起作用。

+1

這是一個棘手的解決方案,運作良好! –