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;
				}
			}
		});
时间: 2024-10-16 07:32:43

Android FragmentTransaction在不同版本下的奇怪问题的相关文章

IScroll在某些win10版本下的奇怪问题

客户的电脑环境: win10版本 企业微信: useragent mozilla/5.0 (windows nt 6.2; wow64) applewebkit/537.36 (khtml, like gecko) chrome/53.0.2785.116 safari/537.36 qbcore/4.0.1268.400 qqbrowser/9.0.2524.400 mozilla/5.0 (windows nt 10.0; wow64) applewebkit/537.36 (khtml, 

【转】【Android】Android不同版本下Notification创建方法

使用 new Notification(int icon, CharSequence tickerText, long when)构造函数时,Eclipse却提示:" The constructor Notification(int, CharSequence, long) is deprecated " /** * Constructs a Notification object with the information needed to * have a status bar i

Android不同版本下Notification创建方法

项目环境 Project Build Target:Android 6.0 问题: 使用 new Notification(int icon, CharSequence tickerText, long when)构造函数时,Eclipse却提示:" The constructor Notification(int, CharSequence, long) is deprecated " 源码如下: /** * Constructs a Notification object with

使用Android Studio 1.3 版本进行NDK开发

众所周知Android Studio 1.3 版本新增了NDK支持,能够很方便的在上面开发C++或者C代码了,可是预览版功能不是非常完善,需要很多步骤,还有一些奇怪的BUG,整了半天终于可以使用Android Studio完美进行NDK开发了.先看下效果图: 方法: 一.首先将Android Studio更新到1.3版本: 1.检查Android Studio更新. 有些人可能会遇到问题:自己版本低于1.3检查更新却提示已经是最新版本? 那是因为更新渠道不是Beta渠道,需要先将渠道设置为Bet

android中导入低版本project可能会遇到的编译问题(转自: [email&#160;protected])

使用高版本的SDK后再导入以前用低版本的project时,会遇到一些兼容性的问题. (1)Unable to resolve target 'android-5' 因为本机中现在使用的是2.2的SDK,API的版本是8:而导入的工程使用的是2.0开发的,其API版本是5. 需要将default.properties中的target=android-5改为target=android-8就好了. 但要注意,也要同步将AndroidManifest.xml中的<uses-sdk android:mi

Android SDK与ADT版本不匹配的解决

打开eclipse时出现无法识别android的项目,即所有android项目均显示红色错误标记.点击菜单Window的Android Virtual Device Manager 插件的标志时出现了Location of the Android SDK has not been setup in the preferences. 如下图所示: 单击“OK”按钮,会出现如下对话框(没有的话,选择eclipse菜单Window的Preferences):      SDK Location设置正确

android 4.0之前版本出现JSONException异常

今天在调试解析服务器传过来的JSON数据时,在2.3.7的手机上报了下面这样一个异常. 08-07 22:00:29.597: W/System.err(7610): org.json.JSONException: Value  of type java.lang.String cannot be converted to JSONArray 而在android4.0版本以上的手机上调试是没有问题的,从而去看了下android4.0 JSONArray源码,发现有如下变化 从对比图片来看,问题

Android电源管理简介(下)

文章转载自:http://blog.csdn.net/hzdysymbol/archive/2009/03/19/4004791.aspx Kernel层 其主要代码在下列位置: drivers/android/power.c 其对Kernel提供的接口函数有 EXPORT_SYMBOL(android_init_suspend_lock); //初始化Suspend lock,在使用前必须做初始化 EXPORT_SYMBOL(android_uninit_suspend_lock); //释放

Android应用之——最新版本SDK V2.4实现QQ第三方登录

为什么要写这篇博客呢?因为,我在做这个第三方登录的时候,找了很多资料,发现要么就是过时了,要么就是说的很不清楚,很罗嗦,而且很多都是一些小demo,不是什么实例,甚至连腾讯官方的文档都有这个问题,文档中很多地方用的不是最新的sdk写的示例,用最新版本的sdk发现根本没法达到预期的效果,很多api已经发生了变化,demo还是用的原来的api中的方法,最坑爹是demo下载下来还要一个支持的库文件,但是sdk中又没有提供.. 自己跌跌撞撞,查找资料,整合,弄了几个小时,终于把它给整出来了,用在了开发的