Android笔记
界面布局
AppBarLayout中嵌套ToolBar可以为ToolBar添加阴影效果
逻辑控制
intent清空任务堆栈
打印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!
}
}
设置文本内容可被选中
获取授权结果
Activity :
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},YOUR_REQUEST_CODE);
Fragment :
突破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注意事项
ExpandableListView
若group
个数变化时,修改adapter
中数据和刷新expandableListView
界面需要在同一进程中依次进行,若在主界面中修改数据,在新进程中刷新界面会导致刷新界面时发生数组溢出的错误,eg:一个group1
时,该group1
有两个child
,动态加入一个新group2
(无child
)时,会出现group1
中child
个数次数组溢出错误,初步估计原因是刷新界面时依旧以为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);
}
获取颜色
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点击事件无效
RecycleView
在RelatedView
中切换显示时,要为其设OnItemClick
时要确保其上传无布局。- 列表item中内层
LinearLayout
设置clickable="true"
并将ID赋给外层LinearLayout
会导致onclick
事件无法触发的bug,解决方法为将clickable="true"
改为focusable="true"
或者将ID赋给内层LinearLayout
。
自定义attr
中的colorPrimaryLight
- 加
attr
文件 - 在主
style
声明该颜色 - 使用
?attr/colorPrimaryLight
配置相关
Android SDK更新
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
卡在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
或者
#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文档
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");