2017-02-20 33 views
1

我有一個應用程序項目,其中有10個片段。當用戶打開一個片段時,我想在代碼中知道這一點,並保存片段作爲最後一位Fragment用戶訪問過的片段。如何檢測片段當前正在使用

如果用戶關閉應用程序並再次打開,最後訪問的這個片段將顯示給用戶。

我讀了很多關於這個問題的答案,並沒有就解決方案達成共識,以瞭解Fragment目前對用戶可見的內容。

我在想FragmentManager的子類可能用來檢測彈出和監視隊列狀態。

或者可能會在Fragment中放入一些GestureDetector.OnGestureListener,當發生火災時,我可以保存上次訪問的Fragment用戶。

任何幫助將是爐排

,當用戶在該片段中按返回按鍵

/** 
    * user press back button 
    */ 
    @Override 
    public void onBackPressed() { 
     //Fragment fragment = getVisibleFragment(); 

     //get the name from the topmost BackStackEntry which is also the fragment tag. 
     String fragmentTag = mFragManager.getBackStackEntryAt(mFragManager.getBackStackEntryCount()-1).getName(); 

     Fragment currentFrag = mFragManager.findFragmentByTag(fragmentTag); 
     if (currentFrag == null) { 
      super.onBackPressed(); 
     } 

     if (currentFrag != null) { 
      if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.CHAT_FRAGMENT.toString())) { 
       if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) { 
        openDrawer(false); 
       } else 
        requestBeginTransaction(SettingsManager.FragmentsModel.LAUNCHER_FRAGMENT.toString(), true, false); 
      } else if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.BILLBOARD_FRAGMENT.toString())) { 

      } else if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.NEWS_FRAGMENT.toString())) { 

      } else if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.INFO_FRAGMENT.toString())) { 
       super.onBackPressed(); 
      } else if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.SEARCH_FRAGMENT.toString())) { 
       // exit app if the search address view is visible 
       if (currentFrag.getView().findViewById(R.id.search_address_layout).getVisibility() == View.VISIBLE) { 
        exitApp(); 
       } else if (currentFrag.getView().findViewById(R.id.show_search_result_layout).getVisibility() == View.VISIBLE) { 
        // show search address view if Address already exist view is visible 
        currentFrag.getView().findViewById(R.id.search_address_layout).setVisibility(View.VISIBLE); 
        currentFrag.getView().findViewById(R.id.history).setVisibility(View.VISIBLE); 
        currentFrag.getView().findViewById(R.id.show_search_result_layout).setVisibility(View.INVISIBLE); 
        ((SearchFragment)currentFrag).onSearchLayoutVisible(); 
       } 
      } else if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.PREFERENCE_FRAGMENT.toString())) { 
       super.onBackPressed(); 
       //requestBeginTransaction(SettingsManager.FragmentsModel.LAUNCHER_FRAGMENT.toString(), true, false); 
      } else if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.PREFERENCE_FRAGMENT_CHAT_SETTINGS.toString())) { 
       super.onBackPressed(); 
       //requestBeginTransaction(SettingsManager.FragmentsModel.LAUNCHER_FRAGMENT.toString(), true, false); 
      } else if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.PREFERENCE_FRAGMENT_THEME_SETTINGS.toString())) { 
       super.onBackPressed(); 
       //requestBeginTransaction(SettingsManager.FragmentsModel.LAUNCHER_FRAGMENT.toString(), true, false); 
      } else if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.LAUNCHER_FRAGMENT.toString())) { 
       super.onBackPressed(); 
       //requestBeginTransaction(SettingsManager.FragmentsModel.LAUNCHER_FRAGMENT.toString(), true, false); 
      } 
     } else 
      exitApp(); 
    } 

在上面的代碼我彈出片段和不知道片段是什麼下這是發生什麼事popt片段。

這是當我添加或顯示片段

/** 
    * Change the current displayed fragment by a new one. 
    * - if the fragment is in backstack, it will pop it 
    * - if the fragment is already displayed (trying to change the fragment with the same), it will not do anything 
    * 
    * @param backStateName    the new fragment to display 
    * @param saveInBackstack if we want the fragment to be in backstack 
    * @param animate   if we want a nice animation or not 
    */ 
    public void requestBeginTransaction(String backStateName, boolean saveInBackstack, boolean animate) { 
     Fragment frag = null; 
     if (mFragManager.findFragmentByTag(backStateName) != null) { 
      frag = mFragManager.findFragmentByTag(backStateName); 
     } else 
      try { 
       frag = (Fragment) Class.forName(backStateName).newInstance(); 
      } catch (InstantiationException e) { 
       e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } catch (ClassNotFoundException e) { 
       e.printStackTrace(); 
      } 
     try { 
      FragmentManager manager = getSupportFragmentManager(); 
      boolean fragmentPopped = manager.popBackStackImmediate(backStateName, 0); 

      if (!fragmentPopped && manager.findFragmentByTag(backStateName) == null) { 
       //fragment not in back stack, create it. 
       FragmentTransaction transaction = manager.beginTransaction(); 

       if (animate) { 
        LogManager.d(this, "Change Fragment: animate"); 
        // transaction.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right); 
       } 

       transaction.add(R.id.frame, frag, backStateName); 

       if (saveInBackstack) { 
        LogManager.d(this, "Change Fragment: addToBackTack " + backStateName); 
        transaction.addToBackStack(backStateName); 
        LogManager.d(this, "Change Fragment: NO addToBackTack"); 
       } 

       transaction.commit(); 
      } else { 
       mFragManager.beginTransaction().show(mFragManager.findFragmentByTag(backStateName)).commit(); 

       // custom effect if fragment is already instanciated 
      } 
     } catch (IllegalStateException exception) { 
      LogManager.w(this, "Unable to commit fragment, could be activity as been killed in background. " + exception.toString()); 
     } 
    } 
+0

您可以檢查isAttached(); – AnixPasBesoin

回答

1

您可以通過觀察它的情況下進行測試。

Fragment fragment = getFragmentManager().findFragmentById(R.id.fragment_container); 
if (fragment instanceOf Fragment1) { 
// It is fragment of class Fragment1 
} else if (fragment instanceOf Fragment2) { 
// It is fragment of class Fragment2 
} 

當用戶按下後退按鈕,這個在你activity(不是片段):

@Override 
public void onBackPressed() { 

    super.onBackPressed(); 

    Fragment fragment = getFragmentManager().findFragmentById(R.id.fragment_container); 
    if (fragment instanceOf Fragment1) { 
    // It is fragment of class Fragment1 
    } else if (fragment instanceOf Fragment2) { 
    // It is fragment of class Fragment2 
    } 

    // Save to prefs which fragment tag it is 
} 
+0

你的意思是我應該在碎片內部調用它嗎?那當我應該運行這個代碼? –

+0

已更新。你可以這樣做來檢查它是哪個片段。 – zed

+0

否則,你可能想要做到這一點:http://stackoverflow.com/questions/9294603/get-currently-displayed-fragment – zed

0

如果你只需要知道最後一個可見的片段,如果用戶關閉應用程序以恢復它,我建議在啓動時將片段的標記(或某個標識符)存儲在SharedPreferences中。然後,您可以稍後使用該首選項值在應用程序啓動時設置正確的片段。 您可以通過覆蓋onStart()片段方法來實現這一點。

+0

如果我做'交易只會工作。替換'當添加碎片時,我不使用'transaction.add'因爲我不想讓碎片重新啓動丟失狀態 –

相關問題