Android开发记录

好久没有写文章了,然后回顾了之前的文章,发现自己竟然从未总结过Android开发过程中的点点滴滴,于是就最近遇到的Java和Android的基础问题进行总结。

1、switch语句的参数值不能为null,否则会抛出NullPointerException

错误代码示例:

String content = null;
switch(content) { // 2、其实可能在这里就已经错了
    case "1":
        System.out.println("1");
        break;
    case "2":
        System.out.println("2");
        break;
    default: // 1、你以为会执行这里的代码
        System.out.println("错误");
        break;
}

2、单行显示,超出使用...符号展示

使用lines=1实现:

android:lines="1"
android:ellipsize="end"

lines=1

使用singleLine=true实现:

android:singleLine="true"
android:ellipsize="end"

singleLine=true

3、使用ArrayList addAll时需要判断值是否为NULL,否则会抛出NullPointerException。

4、在成员变量中声明ArrayList时,不要进行初始化(首先可能会被GC回收,进而引发NullPointerException,其次影响内存和性能),应该在用到的时候进行初始化

常用代码示例:

private List<String> textList;

public void updateData(List<String> textList) {
    if (this.textList == null) {
        this.textList = new ArrayList<>();
    } else {
        this.textList.clear();
    }
    if (textList != null) {
        this.textList.addAll(textList);
    }
    notifyDataSetChanged();
}

5、ImageView的adjustViewBounds属性说明

官方说明:Set this to true if you want the ImageView to adjust its bounds to preserve the aspect ratio of its drawable.

个人总结:

  1. 在布局中文件添加android:adjustViewBounds="true"语句,则该ImageView的ScaleType会被设置为fitCenter,除非再单独在布局文件中设置ScaleType属性,或者是在Java代码中设置ScaleType属性;
  2. 只有在layout_width和layout_height其中之一是固定值,另外一个是wrap_content的时候,设置adjustViewBounds才有意义,比如设置layout_width的值为100dp,设置layout_height的值为wrap_content,那么就有以下两种情况:
    2.1. 图片的宽度大于等于100dp:图片将等比例缩放到ImageView中。
    2.2. 图片的宽度小于100dp:图片不会缩放,ImageView的高度等于图片的高度。

6、TextView的includeFontPadding属性说明

官方说明:Leave enough room for ascenders and descenders instead of using the font ascent and descent strictly. (Normally true).

个人总结:includeFontPadding可以帮助我们去除字体的上下内边距,即padding的值,但并不改变字体本身的高度!!!具体的在Android中字体高度的解释,请看下面的图文详解。

图文详解:引用地址

  • Top - The maximum distance above the baseline for the tallest glyph in the font at a given text size.
  • Ascent - The recommended distance above the baseline for singled spaced text.
  • Descent - The recommended distance below the baseline for singled spaced text.
  • Bottom - The maximum distance below the baseline for the lowest glyph in the font at a given text size.
  • Leading - The recommended additional space to add between lines of text.

Android字体高度图解

Android字体高度图解2

7、Run/Debug Configurations弹框中提示Error: Please select Android SDK错误信息,导致无法运行

解决办法:进入File -> Project Structure,选择左侧Modules下的某个module,在右侧Properties选项卡下的Build Tools Version随便选择一个版本,点击OK,Build完成之后就可以运行了。这个时候,如果不需要指定Build Tools Version,可以进行revert,具体操作请参考下面的GIF图(注:GIF图有8432KB,服务器比较差,请耐心等待...):

Please select Android SDK

8、gradle指令:api、implementation、compile、provided的区别

序:com.android.tools.build:gradle:3.0.0之后新增api和implementation指令。

  • api:等同于compile,功能:假设A api B, B api C,那么A可以调用到C的方法。
  • implementation:功能:假设A implementation B, B implementation C或者A implementation B, B api C或者A api B, B implementation C,那么A调用不到C的方法。
  • provided:一个用于只编译不打包场景(例如:插件化场景)的命令,就是,我在编译的时候对某一个jar文件有依赖,但是最终打包apk文件时,我不想把这个jar文件放进去,可以用这个命令。

9、ViewGroup的clipToPadding属性说明

官方说明:true to clip children to the padding of the group, and resize (but not clip) any EdgeEffect to the padded region. False otherwise.

个人总结:以列表为例:true的时候,paddingTop部分不会跟随列表滚动,列表内容距离顶部具有固定的paddingTop值;false的时候,刚初始化页面之后,列表内容距离顶部的值为paddingTop,但是滚动的时候paddingTop会跟随列表滚动,此时列表内容距离顶部的距离就不是paddingTop了,可以想象为为列表添加一个Header之后的滚动效果。

适合场景:设置列表的第一个(最后一个)Item距离屏幕顶部(底部)有一段距离的情况。

10、AndroidStudio突然编译失败,报错:null value in entry: annotationProcessorOutputFolder=null

解决办法:删除Project下的.gradle文件夹,然后Rebuild Project即可。

11、使用Integer.valueOf方法的时候一般需要try...catch,因为数据一般是由后端返回的,否则会抛出NumberFormatException

12、EditText第二次覆盖掉输入框

复现设备:MI 3W,Android6.0.1

复现场景:加入购物车选择规格弹框(一般是半透明背景),选择数量EditText第二次点击会被软键盘覆盖掉。

复现代码:

  • 自定义一个继承自Dialog(继承自DialogFragment也一样有问题)的Dialog:
public class CustomDialog extends Dialog {

    public CustomDialog(@NonNull Context context) {
        super(context);
    }

    public CustomDialog(@NonNull Context context, int themeResId) {
        super(context, themeResId);
    }

    protected CustomDialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) {
        super(context, cancelable, cancelListener);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialog_custom);
    }

}
  • 布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#00000000">

    <EditText
        android:id="@+id/edit_text"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:layout_alignParentBottom="true"
        android:layout_margin="10dp"
        android:background="@color/colorAccent"
        android:gravity="center"
        android:inputType="number" />

</RelativeLayout>

只要EditText需要同时设置inputType属性和gravity属性,其中inputType属性值不为none,gravity属性值不为center_vertical,就能复现。

解决办法:将EditText的inputType属性改为numeric属性,但是需要注意的是numeric属性只支持数字展示。

添加新评论