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

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

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

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

    1.资源文件中用HTML标签把文本包起来即可

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

Java代码中可以这样处理:

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

  1. 当将一个Android工程设置为Library之后,在另外一个Android工程中如果通过Configure build Path –> Java Build Path –> Project选项 –> Add刚刚设置的library工程的话,是无法识别library工程中的资源文件的(引用资源文件编译不通过)。应该这样设置Configure build Path –> Android –> library选项 –> Add刚刚设置的library工程。
  1. Java中三目运算符如果和自动拆箱一起用会出现空指针异常,如下代码:
    1
    2
    3
    Map<String, Boolean> map = new HashMap<String, Boolean>();
    Boolean b = (map != null ? map.get("test") : false);
    System.out.println(b);

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

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

  1. Activity中两个Fragment进行切换时,例如:有FragmentA和FragmentB,进入Activity的时候,默认显示FragmentA,我点击FragmentA中的某个按钮切换到FragmentB,同时调用addToBackStack加入到返回栈,当我在FragmentB中点击返回按钮回到FragmentA时,FragmentA中的onResume方法却不执行。遇到这个问题的话可以看看在Activity中是否还保持了对FragmentB的引用,比如加入到了某个集合中或是声明成了Activity的成员变量,都会引发此问题。
  1. Android中内部类就算实现了Serializable接口,也不能通过Intent进行序列化传参。如果传递的参数为序列化对象,该对象类不能是某个类里面的内部类。
  1. java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState。出现问题的时机:我在进行Activity跳转时,会调用super.onBackPressed()方法手动finish掉当前的Activity(继承自android.support.v4.app.FragmentActivity),当屏幕处于竖屏状态时没有任何问题,但是当我设置为横屏在进行跳转操作时,会出现上述异常。 异常信息如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
    at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1343)
    at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:486)
    at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:179)
    at com.emap.base.BaseActivity.finishActivity(BaseActivity.java:360)
    at com.emap.air.activity.IndexActivity$1.handleMessage(IndexActivity.java:128)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:5119)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:834)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
    at dalvik.system.NativeStart.main(Native Method)

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

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

参考文章:http://zhiweiofli.iteye.com/blog/1539467

  1. TextView通过代码设置字体大小要使用如下方式textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.dp_10));必须要使用该方法设置单位类型,否则设置的字体效果会和你预期的不一样

原创文章,本文采用知识共享署名 2.5(中国大陆许可协议)进行许可,欢迎转载,但转载请注明来自ittiger.cn,并保证转载后文章内容的完整性。本人(laohu)保留所有版权相关权利。



评论