目前在做的一款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;
}
}
});