2016-12-05 69 views
1

我有一個活動和兩個片段的Android應用程序。第一個片段(MainFragment)顯示「項目」列表,第二個(DetailsFragment)顯示項目的詳細信息(非常基本)。回到默認片段

在正常流程中,活動啓動並顯示第一個片段,第二個片段顯示在單擊某個項目時。

但是第二個片段可以直接通過點擊通知來顯示(通過向活動添加額外的參數)。

String id = getIntent().getStringExtra("id"); 
FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 

if (id != null) { 
    fragment = new DetailsFragment(); 
    Bundle args = new Bundle(); 
    args.putString("id", id); 
    fragment.setArguments(args); 
} else { 
    fragment = new MainFragment(); 
} 

ft.replace(R.id.main, fragment); 
ft.commit(); 

在第二種情況下,問題是:如何從DetailsFragment點擊回來的時候打開MainFragment?其實應用程序完成,因爲只有第二個片段已被創建。

回答

2

First way:它很簡單。你只需要使用addToBackStack(null)。它會保存你想要的片段,當你使用壓縮時它會打開那個片段。

做這樣的事情:

if (id != null) { 
    fragment = new DetailsFragment(); 
    Bundle args = new Bundle(); 
    args.putString("id", id); 
    fragment.setArguments(args); 
    ft.replace(R.id.main, fragment); 
    ft.commit(); 
} else { 
    fragment = new MainFragment(); 
    ft.replace(R.id.main, fragment).addToBackStack(null); 
    ft.commit(); 
} 

Second way:在DetailsFragment的的onResume()方法編寫代碼。

@Override 
    public void onResume() { 
     super.onResume(); 

    getView().setFocusableInTouchMode(true); 
      getView().requestFocus(); 
      getView().setOnKeyListener(new View.OnKeyListener() { 
       @Override 
       public boolean onKey(View v, int keyCode, KeyEvent event) { 


        if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { 
         fragment = new MainFragment(); 
         fragmentManager = getFragmentManager(); 
         fragmentTransaction = fragmentManager.beginTransaction(); 
         fragmentTransaction.replace(R.id.main, fragment); 
         fragmentTransaction.commit(); 
         return true; 
        } 
        return false; 
       } 
      }); 
} 
+0

但是,當我從通知 – woprandi

+0

我我不會進入到'else'塊應用我在回答中編輯的第二種方式。 –

1

這是Android中非常普遍的情況,只是簡單地說你可以將它添加到backstack中。所以當用戶按回按鈕時,他會看到前一個片段(MainFragment)。

getFragmentManager() 
       .beginTransaction() 
       .addToBackStack(yourFragment.getClass().getSimpleName()) 
       .replace(R.example.container, yourFragment) 
       .commit(); 

有關於back stack

更新閱讀官方Android文檔:

如果打開DetailsFragment直接(不打開MainFragment),那麼你應該檢查返回堆疊,如果是空的,然後打開MainFragment手動。下面是完整的代碼:

if (getSupportFragmentManager().getBackStackEntryCount() == 0) // empty back stack{ 
      getFragmentManager() 
          .beginTransaction() 
          .replace(R.example.container, MainFragment) 
         .commit(); 
    } 
+0

因爲如果我直接進入'DetailsFragment',我不會添加'MainFragment',我不明白 – woprandi

+0

@woprandi如果您在開始時在您的活動中打開一個片段(例如onCreate),然後打開另一個片段DetailsFragment並那麼如果你按下返回按鈕,你將被定向到MainFragment。說得通? – szholdiyarov

+0

只有當我直接打開DetailsFragment(沒有打開MainFragment之前)時,纔會出現我的問題。如何總是返回到MainFragment,即使它尚未打開? – woprandi

0

您可以使用這樣的事情,你的背部按或後退按鈕點擊

FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
fragment = new MainFragment(); 
ft.replace(R.id.fragment_container, frag); 
ft.commit(); 
+0

這不是一個好的解決方案,因爲每次用戶按下後退按鈕時都會調用commit。此外,在這種情況下,開發人員需要重寫onBackPressed並手動處理默認功能。 – szholdiyarov

+0

哦,是的,你是對的..感謝您的更正 –

0

添加片段這樣

FragmentManager manager = getSupportFragmentManager(); 

FragmentTransaction ft = manager.beginTransaction(); 
ft.replace(containerId, fragment); 
ft.addToBackStack(backStateName); 
ft.commit(); 

,並在您的活動backpress把這個

getSupportFragmentManager().popBackStack(); 
+0

這裏不需要popBackStack(),因爲android會自行處理它。 – szholdiyarov

0

添加的主要片段在活動的onCreate()和覆蓋onBackPressed()中的主要活動

FragmentTransaction mFragmentTransaction = fragmentManager.beginTransaction(); 


     mFragmentTransaction.replace(R.id.frame_container_recharege, fragment); 
     mFragmentTransaction.commit(); 

@Override 
     public void onBackPressed() { 
      FragmentManager fragmentManager = getSupportFragmentManager(); 
      if (fragmentManager.getBackStackEntryCount() > 1) { 
       fragmentManager.popBackStack(); 
      } else { 
       super.onBackPressed(); 

      } 


     } 
+0

它工作只是總是添加MainFragment之前,但我不喜歡,因爲我會加載所有項目爲空 – woprandi

+0

是的!您可以通過第二個片段直接oncreate()活動替換幀容器。如果您傳遞一些參數到活動。 –

+0

添加驗證,如果用戶點擊通知,然後在後臺添加片段,否則不添加在後臺。同樣的標誌,你可以應用onBackPresed()。標誌在通知上點擊backPressPress()由主片段替換frameContainer。 –