跳转至

Android笔记

界面布局

AppBarLayout中嵌套ToolBar可以为ToolBar添加阴影效果

img img

逻辑控制

intent清空任务堆栈

// 清空任务堆栈
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

打印Json中所有的内容

Iterator<String> iter = dataJson.keys();
while (iter.hasNext()) {
    String key = iter.next();
    try {
        Object value = dataJson.get(key);
        Log.e("Http", key+" : "+value);
    } catch (JSONException e) {
        // Something went wrong!
    }
}

设置文本内容可被选中

show.setTextIsSelectable(true);
android:textIsSelectable="true"

获取授权结果

Activity :

ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},YOUR_REQUEST_CODE);

Fragment :

requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, YOUR_REQUEST_CODE);

突破heap size为128的限制

在Application标签中使用android:largeHeap="true"可以突破heap size为128的限制

查看当前heap size:

ActivityManager manager= (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
int heapsize=manager.getMemoryClass();
LogUtils.e("heap size is " + heapsize);

ExpandableListView注意事项

ExpandableListViewgroup个数变化时,修改adapter中数据和刷新expandableListView界面需要在同一进程中依次进行,若在主界面中修改数据,在新进程中刷新界面会导致刷新界面时发生数组溢出的错误,eg:一个group1时,该group1有两个child,动态加入一个新group2(无child)时,会出现group1child个数次数组溢出错误,初步估计原因是刷新界面时依旧以为group1有两个child而数据源已改变为空的List而出现数组溢出。

正确代码:

lv_handler.post(new Runnable() {
    @Override
    public void run() {
        //此处列表个数变化 数据更新和界面变化必须在同一线程依次进行
        scanAdapter.is_ble_open = true;
        scanAdapter.setGroupStringsByBle();
        scanAdapter.notifyDataSetChanged();
        scanAdapter.notifyDataSetInvalidated();
        ble_scan_expand.invalidateViews();
        expandAllGroup(ble_scan_expand);
    }
});

会发生错误代码:

scanAdapter.is_ble_open = true;
scanAdapter.setGroupStringsByBle();
lv_handler.post(new Runnable() {
    @Override
    public void run() {
        scanAdapter.notifyDataSetChanged();
        scanAdapter.notifyDataSetInvalidated();
        ble_scan_expand.invalidateViews();
    }
});
expandAllGroup(ble_scan_expand);

Fragment中使用startActivityForResult

Fragement`必须使用`startActivityForResult(intent, code);`而不是`getActivity().startActivityForResult(intent,111);

Fragment所在的父activity必须重写(必须调用super):

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
}

获取颜色

ContextCompat.getColor(getContext(), R.color.color_xxx)

onDraw()方法中new对象

onDraw()方法不推荐new对象因为该方法会被系统多次调用可能会导致内容泄露
> [Object allocation during draw/layout?](https://stackoverflow.com/questions/16472529/object-allocation-during-draw-layout#)

java.util.ConcurrentModificationException

在迭代过程中`remove`数组元素后没有`break`迭代,会抛出该错误。举例:若数组中有3个元素,在循环读取到第2个元素时,`remove`了第二个元素但是并未退出循环,读取第3个元素时会发生该错误。解决方法为`remove`后立即退出迭代。

RecycleView Item点击事件无效

  • RecycleViewRelatedView中切换显示时,要为其设OnItemClick时要确保其上传无布局。
  • 列表item中内层LinearLayout设置clickable="true"并将ID赋给外层LinearLayout会导致onclick事件无法触发的bug,解决方法为将clickable="true"改为focusable="true"或者将ID赋给内层LinearLayout

自定义attr中的colorPrimaryLight

  • attr文件
  • 在主style声明该颜色
  • 使用 ?attr/colorPrimaryLight

配置相关

Android SDK更新

setting->搜索SDK->选择SDK tools进行更新

更新完成刷新项目即可

Error:Failed to open zip file. Gradle's dependency cache may be corrupt

* 前往下载对应的gradle文件,直接替换url中的版本号即可,对应的版本号可在`gradle/gradle-wrapper.properties`文件中查看,http://downloads.gradle.org/distributions/gradle-4.1-all.zip 。
* 下载并解压压缩文件至 `C:\Users\ykh\.gradle\wrapper\dists\gradle-4.1-all`
* File->setting->Build,Execution,Deployment->Gradle,选择`Use locale gradle distribution->Gradle home`,选中之前解压的文件夹。
* File->Synchronize

Please select Android SDK

File -> Sync Project with Gradle Files

卡在Grade更新

`File\Settings\Build, Execution, Deployment\Build tools\Gradle`,重选`Grade Home`至`C:\android-studio\gradle\gradle-4.1.`。

Author Info

打开Settings -> Editor -> File and Code Templates -> Includes -> File Header

/**
* Created by ${USER} on ${DATE}.
*/

或者

#set ($USER = "Name name")
#set ($COMPANY = "company Ltd")
#set ($EMAIL = "example@gmail.com")

/**
 * Created by ${USER} on ${DATE}.
 * ${COMPANY}
 * ${EMAIL}
 */

实时预览Preview不生效

SDK的image未完全安装成功可能导致preview失败,解决方法是重新选择preview使用的SDK版本或者完全安装该SDK对应的image。

生成JavaDoc文档

Tools->Generate JavaDoc

Locale设置为en,Other command line arguments设置为-encoding utf-8 -charset utf-8防止中文注释报 错误: 编码GBK的不可映射字符。

cannot resolve symbol after update

方法一:You can do "File" -> "Invalidate Caches...", and select "Invalidate and Restart" option to fix this.(无效)

方法二:

1 Exit from Studio
2 Delete .idea/, build/, app/build/ directories.
3 Start Studio.
4 Re-setup Settings->Build tools->Gradle to use local distribution (last stable Gradle locally installed)
5 app run failed, user File -> Sync Project with Gradle Files.

Command Pattern

public interface Command {
    public void execute(Object data);
}

public class PrintCommand implements Command {
    public void execute(Object data) {
        showToast(data.toString());
    }
}

public static void callCommand(Command command, Object data) {
    command.execute(data);
}

callCommand(new PrintCommand(), "hello world");

Java8

can be replaced with method reference

sendLoop(new SendLoopInterface() {
    @Override
    public void onSend() {
        PATCH();
    }
});

sendLoop(this::PATCH);