studio 无法输入中文
参考:https://www.cnblogs.com/liuwenpeng/p/12332246.html远场诊断 so 方案livedata 无法收到回调, 原因是在父类的 initData 方法中做了监听,但是子类重写 initData 的时候没有调用父类的 initData 的方法导致没有注册 Livedata,自然无法收到回调
- 搜狗输入法在 studio 中无法输入中文
参考:https://www.cnblogs.com/liuwenpeng/p/12332246.html
- Installation failed due to: 'Failed to commit install session 1642747687 wit INSTALL_FAILED_VERIFICATION_FAILURE
AS 运行无法安装,
解决办法: 1. 执行 adb shell settings put global package_verifier_enable 0
2.adb shell settings put global verifier_verify_adb_installs 0
- 手动用 adb install -t 安装
4.再直接运行就可以安装成功了
- 启动 service 报错
java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.apache.demo/com.apache.demo/.SoundBoxMsgService (has extras) }: app is in background uid null
- 智能音箱报 无法实例化 applicaiton
java.lang.RuntimeException: Unable to instantiate application
原因 framework.jar 是使用 implementation 而不是 compileOnly 的方式,改为 compileOnly 就可以了
- 提示 Type androidx.lifecycle.ViewModelProvider$Factory is defined multiple times
- Android 8.0 启动service 报错
- complileOnly framework.jar
采用 compileOnly 的方式依赖了 framework.jar ,但是编译的时候只能导入 系统的类,没法导入 framework.jar种的类导致无法编译,解决办法是修改编译顺序, 将 android sdk 的放到 jar 包依赖的后面
- Android studio 无法输入中文原因:
搜狗输入法的英文输入法快捷键和 AS 的快捷键冲突了,参考: https://www.cnblogs.com/liuwenpeng/p/12332246.html
- 运行 app 时桌面展示多个应用启动图标,原因是在manifest中有多个activity 设置了
在 databinding中使用 livedata做数据映射时,一定要记得调用 dataBinding.lifecycle = this, 否则 livedata的数据无法在 xml中展示
fragment 中重写了 oncreateoptionsmenu 但是 在 toolbar 无法展示 menu菜单,原因
1.没有执行 setSupportActionBar(Toolbar toolbar). 2.没有执行 setHasOptionsMenu(true)使用 ViewPage 承载多个Fragment, 在 Fragment的 initData方法中 调用 LiveData 的observer 方法,发现 LiveData post数据, LiveData 都能收到 多次 onChange 回调,原因是 initData 方法是定义在 onCreateView 方法中, 来回切换tab的时候会多次执行
onCreateView 方法导致 observer执行了多次,因而会收到多次回调,解决办法是做一个标记处理studio 执行 ./gradlew. 报错,提示
env: bash\r: No such file or directory
解决办法: https://blog.csdn.net/u012452490/article/details/102546481
- 跑单元测试,提示
解决办法:https://stackoverflow.com/questions/30474767/no-tests-found-for-given-includes-error-when-running-parameterized-unit-test-in
- 编译报错
A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask$KaptExecutionWorkAction > java.lang.reflect.InvocationTargetException (no error message)
解决办法: https://stackoverflow.com/questions/62131564/a-failure-occurred-while-executing-org-jetbrains-kotlin-gradle-internal-kaptexec?noredirect=1
修改gradle -> jdk 版本引用
- Mac下查看已安装的jdk版本及其安装目录
- NestedScrollview 内部嵌套 Recycleview, recycleview的height设置为wrap_content导致 recycleview 的item无法展示
- RecyclerView setHasFixedSize 作用
当我们确定Item的改变不会影响RecyclerView的宽高的时候可以设置setHasFixedSize(true),并通过Adapter的增删改插方法去刷新RecyclerView,而不是通过notifyDataSetChanged()。(其实可以直接设置为true,当需要改变宽高的时候就用notifyDataSetChanged()去整体刷新一下)
- TabLayout 是没法设置item之间的间隔的,只能自己设置background中去设置padding,参考:https://blog.csdn.net/lin_dianwei/article/details/78806816
- 版本更新接口报错
2021-07-18 18:04:40.297 1876-2053/com.kidsedu D/OKHttp: 接收响应(247.5ms): [http://kids.test.edu.tcljd.com/api/system/getUpdateInfo?packageName=com.kidsedu]
Server: openresty/1.15.8.3
Date: Wed, 21 Jul 2021 10:04:40 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
{"code":0,"msg":"Success","data":""}
报错位置
2021-07-18 18:04:40.303 1876-2053/com.kidsedu E/GsonResponseBodyConverter: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 35 path $.data
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
at com.kidsedu.retrofit.convertor.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:36)
at com.kidsedu.retrofit.convertor.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:21)
at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:119)
at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:218)
at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:112)
at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 35 path $.data
Textview.setTextSize()时,传入的单位为sp,不用转为px,Paint.setTextSize();单位为:象数px,这个时候需要将 sp转为px
RecycleView 用gridlayout时,recycleview的高度写成matchParent。导致item只会横向显示,不会换行
定义ViewModel时,定义了一个有参的构造器,但是没有定义无参构造器,导致报 "java.lang.RuntimeException: Cannot create an instance of class com.kidsedu.overseaaccount.capture.OverseaCaputreViewModel"
代码如下:
public class OverseaCaputreViewModel extends ViewModel{
public OverseaCaputreViewModel(boolean notLoadData) {
NLog.d(TAG, "cosntructor OverseaCaputreViewModel notLoadData");
}
}
解决办法:增加无参构造器
- 用ScrollView 包裹LinerLayout 或者 RelativeLayout时,发现包裹的布局无法撑满屏幕,
-
使用ViewModel报错
原因是ViewModel不是设置为public
- 使用开源框架 banner报错
代码如下:
@Override
public MainHeaderViewHolder onCreateHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_main_head, parent, false);
return new MainHeaderViewHolder(itemView);
}
原因是banner中使用viewPage2,viewPage2要求设置子item的需要长或者宽度为match_paren
改为以下就可以了
@Override
public MainHeaderViewHolder onCreateHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_main_head, parent, false);
//注意,必须设置为match_parent,这个是viewpager2强制要求的
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
itemView.setLayoutParams(params);
return new MainHeaderViewHolder(itemView);
}
Android笔记之Fragment中创建ViewModel的正确方式
ViewPage的Fragment中创建ViewModel需要采用get(String key, Class clz)的方式来创建,否则旋转屏幕后Fragment中的ViewModel为新建的,不会保存activity销毁前的数据
用 MutableLiveData
时,如果没有设置值,在判断其是否有值时
public MutableLiveData mLoading = new MutableLiveData<>();
if (mWechatViewModel.mLoading.getValue()){
}
报空指针异常
MutableLiveData Attempt to invoke virtual method 'boolean java.lang.Boolean.booleanValue()' on a null object
原因是mWechatViewModel.mLoading.getValue 获得的值为null, if中会自动把null转换为boolean值, 改为以下写法就可以了
if (mWechatViewModel.mLoading.getValue() != null){
}
- 内存中保存的变量变空了
自己代码中的问题:
代码中的url是通过接口返回的,存贮到了变量中,在机器内存被回收后,这部分变量值变为了“”,导致出现的这个问题;
修改后
1获取到配置信息后通过工具类的set方法将信息缓存到内存中变量一份,
2.然后再通过SP缓存到本地一份
使用时通过工具类的get方法获取
1.判断内存中变量是否未空,不为空则返回
2.为空,则通过SP从本地获取,然后赋值给内存中变量,最后返回内存中变量
- 显示loading对话框的时候报如下错误
- 做儿童教育时,登录成功后,需要将accoutId保存到本地SP中, 设置是否保存过密码的时候,代码如下
public void setAccountHasPwdInfo(boolean hasPwd) {
setBooleanValue("hasPwd_"+UserInfoManager.getInstance().getAccountId(), hasPwd);
}
- 在ConstraintLayout中使用include,然后给引入布局添加了底部约束,让它距离底部8dp,但是引入布局仍然出现在顶部。原因是没有给include指定宽高,不重新指定一下控件或者布局的宽高,那么给它添加的约束便会失效。
- 继承BaseTraceAcitity, 获取父类中实例化泛型的ViewModel为null,原因是自定义的ViewModel 不是public, 没有写修饰符
- 用RecycleView的grdiLayoutManager展示item时,这些item始终无法居中对齐,原因是item的根布局宽度不是用的match_parent,而是写死了一个dp值,导致和gridLayoutManager计算出的宽度出现冲突了,将布局宽度改为match_parent就可以居中了
- git自动补全命令不生效
虽然按照网上的教程在.bash_profile中做了配置,但是git自动补全命令还是无法生效,原因是通过brew按照的git-completion.bash 和本地安装的git版本不一致
- adb 命令提示
zsh: command not found: adb
用自己mac上的android studio 和 sdk 发送到公司新电脑的,无法识别adb命令,studio也无法识别设备. .bahs_profile 中配置了
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/platform-tools
也没有作用,后面重新下了android studio 和 sdk,就可以了。初步怀疑是platform-tools 和 tools 跟android studio 不匹配
- Mac 总是提醒不明身份的开发者
命令行执行 sudo spctl --master-disable
- 用TabLayout+ ViewPage + Fragment 需要动态添加Tab,例如一开始显示2个tab,在某种情况下需要添加第3个tab来显示,发现第3个tab无法添加成功,且之前添加的两个tab对应的fragment也没有更新数据(通过日志查看adapter中已经是新new出来的Fragment了),
- 在 Mac 上安装内存分析工具「MAT」时,报错
an error has occurred see the log file
解决办法是 右键 mat -> 显示包内容 -> content -> Eclipse -> MemoryAnalyzer.ini , 修改这个MemoryAnalyzer.ini文件 为
-startup
../Eclipse/plugins/org.eclipse.equinox.launcher_1.5.0.v20180512-1130.jar
-data
--launcher.library
../Eclipse/plugins/org.eclipse.equinox.launcher.cocoa.macosx.x86_64_1.1.700.v20180518-1200
-vm
-vmargs
-Xmx1024m
-Dorg.eclipse.swt.internal.carbon.smallFonts
-XstartOnFirstThread
-
用 mat 打开从 android stuido中导出的hprof文件,打开失败,提示 Unknown HPROF Version (JAVA PROFILE 1.0.3) (java.io.IOException)解决办法
解决办法: mat不能直接打开studio导出的hprof文件,需要在打开命令行窗口,SDK目录,执行以下命令:
hprof-conv 1.hprof 2.hprof
然后再次打开MAT程序,打开2.hprof文件,就可以看到正确的分析界面啦!
- 平板横竖屏切换的时候,ViewModel中保存的数据,会在旋转屏幕后被清除掉, 代码如下
mHomeViewModel = new ViewModelProvider(this).get("HomeFragment", HomeViewModel.class);
通过日志打印,发现旋转屏幕后生成的ViewModel和旋转屏幕前的ViewModel不是同一个。进一步发现Fragment生命周期走了两次,通过查看资料发现旋转屏幕fragment周期是会走两次的(我自己写的Demo貌似只会走一次,先不管了)。 思考为什么旋转屏幕后ViewModel会变呢? 原来是ViewModel的实例化姿势不对
改成
mHomeViewModel = new ViewModelProvider(getActivity()).get("HomeFragment", HomeViewModel.class);