Android开发问题汇总–持续更新

Android开发中遇到的小问题汇总,会持续更新。

 

提供网上一个Android开放问题汇总贴:https://github.com/JohnTsaiAndroid/AndroidTips

 

1. TextView控件中给文本添加下划线的几种方式

a).资源文件中用HTML标签<u>把文本包起来即可

 
 
  1. <resources>
  2. <string name="hello"><u>hello</u></string>
  3. </resources>

b).Java代码中可以这样处理:

 
 
  1. TextView textView = (TextView)findViewById(R.id.tv_test);
  2. textView.setText(Html.fromHtml("<u>"+"hello"+"</u>"));
  3. //或者这样处理
  4. textView .getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG ); //下划线

 

2 .当将一个Android工程设置为Library之后,在另外一个Android工程中如果通过Configure build Path –> Java Build Path –> Project选项 –> Add刚刚设置的library工程的话,是无法识别library工程中的资源文件的(引用资源文件编译不通过)。应该这样设置Configure build Path –> Android –> library选项 –> Add刚刚设置的library工程。

 

3.Java中三目运算符如果和自动拆箱一起用会出现空指针异常,如下代码:

 
 
  1. Map<String, Boolean> map = new HashMap<String, Boolean>();
  2. Boolean b = (map != null ? map.get("test") : false);
  3. System.out.println(b);

出现空指针的原因是因为Java三目运算符中第二、三位操作数为基本类型和对象时,会自动将对象拆箱为基本类型数据进行运算(大家可以自己去看官方文档),上述代码中刚好符合这种情况(第二位为对象,第三位为基本类型),map.get(“test”)在实际执行中是这样执行的:((Boolean)map.get(“test”)).booleanValue(),将map中取得的Boolean对象自动拆箱为基本类型,而这个地方map.get(“test”)取出的值为null,自动拆箱的时候就会出现空指针了。如果这个地方一定要用三目运算符,只需要保证第二、三位操作数均为对象即可

 
 
  1. Map<String, Boolean> map = new HashMap<>();
  2. Boolean b = (map != null ? map.get("test") : Boolean.valueOf(false));
  3. System.out.println(b);

 

4.Activity中两个Fragment进行切换时,例如:有FragmentA和FragmentB,进入Activity的时候,默认显示FragmentA,我点击FragmentA中的某个按钮切换到FragmentB,同时调用addToBackStack加入到返回栈,当我在FragmentB中点击返回按钮回到FragmentA时,FragmentA中的onResume方法却不执行。遇到这个问题的话可以看看在Activity中是否还保持了对FragmentB的引用,比如加入到了某个集合中或是声明成了Activity的成员变量,都会引发此问题。

 

5.Android中内部类就算实现了Serializable接口,也不能通过Intent进行序列化传参。如果传递的参数为序列化对象,该对象类不能是某个类里面的内部类。

 

6.java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState。

出现问题的时机:我在进行Activity跳转时,会调用super.onBackPressed()方法手动finish掉当前的Activity(继承自android.support.v4.app.FragmentActivity),当屏幕处于竖屏状态时没有任何问题,但是当我设置为横屏在进行跳转操作时,会出现上述异常。

异常信息如下:

 
 
  1. java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
  2. at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1343)
  3. at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:486)
  4. at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:179)
  5. at com.emap.base.BaseActivity.finishActivity(BaseActivity.java:360)
  6. at com.emap.air.activity.IndexActivity$1.handleMessage(IndexActivity.java:128)
  7. at android.os.Handler.dispatchMessage(Handler.java:99)
  8. at android.os.Looper.loop(Looper.java:137)
  9. at android.app.ActivityThread.main(ActivityThread.java:5119)
  10. at java.lang.reflect.Method.invokeNative(Native Method)
  11. at java.lang.reflect.Method.invoke(Method.java:511)
  12. at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:834)
  13. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
  14. at dalvik.system.NativeStart.main(Native Method)
  15.  

通过上述异常可以看出错误出现的原因并不是我自己写的代码导致的,猜测的话可能跟系统版本有关。

解决办法:将super.onBackPressed()替换成finish()方法来结束当前Activity即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值