有沒有一種相似於咱們在Android Activity中實現的方式能夠在Android Fragment中實現onBackPressed()
? ide
因爲片斷生命週期沒有onBackPressed()
。 在Android 3.0片斷中還有其餘替代方法能夠替代onBackPressed()
嗎? this
根據@HaMMeRed的回答,這裏是僞代碼,它應該如何工做。 能夠說您的主要活動稱爲BaseActivity
,它具備子片斷(如SlidingMenu lib示例中的片斷)。 步驟以下: spa
首先,咱們須要建立接口和實現其接口的類以具備通用方法 code
建立類接口OnBackPressedListener
接口
public interface OnBackPressedListener { public void doBack(); }
建立實現OnBackPressedListener
技能的OnBackPressedListener
生命週期
public class BaseBackPressedListener implements OnBackPressedListener { private final FragmentActivity activity; public BaseBackPressedListener(FragmentActivity activity) { this.activity = activity; } @Override public void doBack() { activity.getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); } }
從如今開始,咱們將處理代碼BaseActivity
及其片斷 get
在類BaseActivity
上建立私有偵聽BaseActivity
it
protected OnBackPressedListener onBackPressedListener;
建立方法以在BaseActivity
設置偵聽BaseActivity
io
public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener) { this.onBackPressedListener = onBackPressedListener; }
在重寫onBackPressed
實現相似的東西 class
@Override public void onBackPressed() { if (onBackPressedListener != null) onBackPressedListener.doBack(); else super.onBackPressed();
在onCreateView
的片斷中,您應該添加咱們的監聽器
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { activity = getActivity(); ((BaseActivity)activity).setOnBackPressedListener(new BaseBackPressedListener(activity)); View view = ... ; //stuff with view return view; }
瞧,如今當您在片斷中單擊返回時,您應該捕獲自定義的返回方法。
在片斷之間進行過渡時,只需添加addToBackStack
,以下所示:
fragmentManager.beginTransaction().replace(R.id.content_frame,fragment).addToBackStack("tag").commit();
若是編寫addToBackStack(null)
,它將自行處理,可是若是提供標記,則應手動處理。
不要實現ft.addToBackStack()方法,這樣當您按下「後退」按鈕時,您的活動將完成。
proAddAccount = new ProfileAddAccount(); FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.fragment_container, proAddAccount); //fragmentTransaction.addToBackStack(null); fragmentTransaction.commit();
這些都不容易實現,也不會以最佳方式發揮做用。
片斷有一個能夠調用onDetach的方法來完成這項工做。
@Override public void onDetach() { super.onDetach(); PUT YOUR CODE HERE }
這將完成工做。
解決方案很簡單:
1)若是您具備全部片斷都擴展的基本片斷類,則將此代碼添加到其類中,不然建立此類基本片斷類
/* * called when on back pressed to the current fragment that is returned */ public void onBackPressed() { // add code in super class when override }
2)在您的Activity類中,以下重寫onBackPressed:
private BaseFragment _currentFragment; @Override public void onBackPressed() { super.onBackPressed(); _currentFragment.onBackPressed(); }
3)在您的Fragment類中,添加所需的代碼:
@Override public void onBackPressed() { setUpTitle(); }