1

我有2個活動。裏面第一次活動有最初一個片段如何在最上面的片段上觸發onResume(),後面按

MainActivity.java

public class MainActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.myactivity); 
     if(savedInstanceState == null) { 
      getFragmentManager().beginTransaction().replace(R.id.fragmentContainer, MainFragment.newInstance().commit(); 
     } 
    } 
} 

然後點擊一個按鈕replaces與另一個片段。

@Override 
public void onClick(View arg0) { 
    DetailFragment detail = (DetailFragment)getFragmentManager().findFragmentById(R.id.detail); 
    getFragmentManager().beginTransaction().replace(R.id.detail, detail, "detail").commit(); 
} 

在2nd Fragment上還有另一個按鈕,點擊它可以打開一個新的活動。

Intent popUp = new Intent(MainActivity.this, PopUp.class);      
popUp.putExtra("CarID", carID); 
startActivity(popUp); 

從PopUp Activity中,按下設備將返回到MainActivity。 現在面臨的挑戰是應用程序的業務邏輯當用戶返回時,我需要更新以前MainActivity的ActionBar標題。

爲此,我在MainFragment和DetailFragment上偵聽onResume()。當用戶從DetailFragment返回MainFragment時,我用不同的文本更新ActionBar標題。

所以我需要的時候正是用戶從追溯到知道:

1)彈出活動>詳細內容片斷

2)詳細片段>主要碎片

目前onResume()被解僱當PopUpActivity關閉時,MainFragmentDetailFragment。在MainFragment我不能確切地找出是否onResume()被稱爲第一或第二種情況。

只有當用戶從PopUpActivity>DetailFragment時,纔會在DetailFragment上觸發onResume()的最佳做法是什麼。換句話說,我如何從DetailFragment檢測到PopUpActivity在沒有開火的情況下關閉onResume() on MainFragment

回答

3

我不會爲onResume()搞這樣的事情。

我建議做以下幾點:

  • 創建標題的Stack<String>
  • MainActivity中執行FragmentManager.OnBackStackChangedListener
  • 在您的onBackStackChanged()實現中,檢查使用FragmentManager.getBackStackEntryCount()推回或彈出了背堆棧。
    • 如果推回堆棧,將新顯示的片段標題推送到您的標題堆棧。
    • 如果後退堆疊已彈出,請彈出標題並將標題欄的標題設置在新的堆疊頂部。
  • 如果設置從添加到後退堆棧片段的標題,彈出從標題棧標題和推新顯示片段的標題,即在頂部更換標題堆棧。
  • startActivityForResult()而非startActivity()調用您的PopupActivity
  • MainActivity中覆蓋onActivityResult(),這樣當PopupActivity返回時,您將標題欄設置爲堆棧頂部的標題。
  • 不要忘記在您的MainActivity中將您的標題棧保留在onSaveInstanceState()中,並在onCreate()中恢復它。

這可能看起來像很多工作只是爲了維護標題,但你會開車試圖與onResume做到這一點。

0

嘗試:

@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){ 

      // handle back button 

      return true; 

     } 

     return false; 
    } 
}); 

}

+0

我給它一個去。謝謝。 – Adnan

相關問題