天天看點

Android FragmentTransaction在不同版本下的奇怪問題

目前在做的一款APP,用到了一個布局塊中的Fragment的切換,其中一個按鈕按下後的事件如下:

btnTranslate.setOnClickListener(new View.OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				/*目前界面不是翻譯界面時才進行下列動作*/
				if( MAIN_FRAGMENT_ID != currentFragmentId )
				{
					setChoosedBtnState(MAIN_FRAGMENT_ID);
					FragmentManager fragmentManager = getFragmentManager();
				    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
					if( null == fragmentTranslate )
						fragmentTranslate = new MainUI();
					hideCurrentFragment(fragmentTransaction);
					fragmentTransaction.show(fragmentTranslate);
<pre name="code" class="java">                                        fragmentTransaction.add(R.id.fragment_content, fragmentTranslate, "MainUI");
           

 fragmentTransaction.commit();currentFragmentId = MAIN_FRAGMENT_ID;}}});

hideCurrentFragment(fragmentTransaction);
fragmentTransaction.show(fragmentTranslate);
           

這兩句本來是為了提高切換速度,并且儲存使用者産生的資料而選用隐藏/顯示來代替replace(remove/add),運作時在Android 4.0的模拟器和我Android 4.1的手機上沒有任何問題,效果也很好,但是當我把程式放在我的Android 4.4(Galaxy S5··貌似這個機型問題挺多···)時出現閃退!具體情形是,當我點選一個按鈕建立了一個Fragment的執行個體時程式正常運作,但是當我再次點選已經建立過執行個體的界面按鈕時就會閃退,一直不明白是怎麼回事,查了API也沒找到相關的說明。

搞了好久,最後看到

<pre name="code" class="java">fragmentTransaction.add(R.id.fragment_content, fragmentTranslate, "MainUI");
           

這句話,它作用就是把産生的Fragment執行個體加入到指定的布局塊中,再聯想我的問題,也就是在加入一次然後再次加入出現了問題,是以試着隻在第一次建立Fragment執行個體時調用這條語句,果然問題解決!

修改後的代碼如下:

btnTranslate.setOnClickListener(new View.OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				/*目前界面不是翻譯界面時才進行下列動作*/
				if( MAIN_FRAGMENT_ID != currentFragmentId )
				{
					setChoosedBtnState(MAIN_FRAGMENT_ID);
					FragmentManager fragmentManager = getFragmentManager();
				    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
					if( null == fragmentTranslate )
					{
						fragmentTranslate = new MainUI();
						fragmentTransaction.add(R.id.fragment_content, fragmentTranslate, "MainUI");
					}
					hideCurrentFragment(fragmentTransaction);
					fragmentTransaction.show(fragmentTranslate);
					fragmentTransaction.commit();
					currentFragmentId = MAIN_FRAGMENT_ID;
				}
			}
		});