«

Android FragmentTransaction在不同版本下的奇怪问题

时间:2024-3-2 17:48     作者:韩俊     分类: Android


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


标签: android

热门推荐