Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android fragment 使用replace並保存狀態

Android fragment 使用replace並保存狀態

編輯:關於Android編程

Fragment的地位在開發中可是舉足輕重的,掌握它的的生命周期以及使用特性是非常重要的,例如在開發中常使用的模板:

\

點擊菜單,中心內容跟隨菜單變化,但是在菜單間切換時,需要保存之前輸入的信息或其他狀態,如果使用Fragment 的hide喎?/kf/ware/vc/" target="_blank" class="keylink">vc2hvd7e9t6jI58/Co7o8L3A+CjxwPjxwcmUgY2xhc3M9"brush:java;">FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.setCustomAnimations(R.anim.right_in, R.anim.left_fadeout, R.anim.right_fadein, R.anim.left_fadeout); transaction.hide(oldFragment); transaction.show(newFragment); transaction.commit();
但是使用這個中方法可能出現一個Bug:在菜單切換時如A-B-C切換,當顯示C內容時,A或B組件的信息也可能顯示出來,並且還可以響應事件,對應用來說可是不能容忍的!

至於為什麼會出現這種問題的原因還沒有調查到,如果您知道,求告知求科普。。。


另一種方法就是使用replace的方式代替hide/show,重點是調用FragmentTransaction.addToBackStack()來保存fragment的狀態,使用代碼如下:

	private void replaceContainer(MenuItems menuItem) {

		FragmentTransaction transaction = fragmentManager.beginTransaction();

		transaction.setCustomAnimations(R.anim.right_in, R.anim.left_fadeout,
				R.anim.right_fadein, R.anim.left_fadeout);

		Fragment fragment = retrieveFromCache(menuItem);

		// fragment沒有實例化過,new出一個添加到FragmentTransaction中,並且保存fragment的狀態
		if (null == fragment) {
			try {
				fragment = menuItem.getClazz().newInstance();
				transaction.addToBackStack(null);
			} catch (Exception e) {

				Log.e(TAG, "實例化菜單失敗");
				return;
			}
		}

		transaction.replace(R.id.content_frame, fragment);

		transaction.commit();
	}

	private Fragment retrieveFromCache(MenuItems menuItem) {
		//從fragmentManager中獲取已有的fragment對象
		for (Fragment backFragment : fragmentManager.getFragments()) {
			if (null != backFragment
					&& menuItem.getClazz().equals(backFragment.getClass())) {
				return backFragment;
			}
		}
		return null;
	}

不僅能保存fragment的狀態,而且fragment的生命周期也能正常走動!!記得FragmentTransaction.addToBackStack()這個很重要哦!



  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved