Google提供的Demo,地址如下:
https://github.com/googlesamples/android-architecture/tree/todo-mvp/
一.关闭AndroidMainfest.xml中黄色波浪线的警告
官方原因:要使Google能够抓取您的应用内容并允许用户从搜索结果中进入您的应用,您必须为manifest中的相关活动添加intent filters。它们允许深入链接到您的任何活动中的内容。例如,用户可以点击深层链接以查看购物应用中的页面,该页面描述用户正在搜索的产品。
解决方法1:
在AndroidManifest.xml文件中,至少一个Activity的intent-filter中添加
<action android:name="android.intent.action.VIEW" />
解决方法2:
在app的build.gradle中添加如下代码:
lintOptions{
disable 'GoogleAppIndexingWarning'
}
二.Activity回退时返回到逻辑父类Activity
有两种方法。
第一种:
第二种:
使用这种方法回退时有限制条件:
1.点击手机返回键回退时是没有效果的,必须使用ActionBar上的返回按钮才可以。
2.Activity必须有ActionBar,因为没有ActionBar的Activity必然没有返回按钮,自然不可以进行回退。
3.回退到的Activity必须已经创建,不能回退到未创建的Activity上。
在使用ActionBar的返回按钮进行回退时,其逻辑如下:
//MainActivity是回退到的Activity
MainActivity.onDestroy()
MainActivity.onCreate(null)
MainActivity.onStart()
可以看到的是,使用这种方法进行回退时,会先销毁原来的MainActivity,然后重新创建一个。
解决方法为设置MainActivity的属性,android:launchMode=singleTop
三.setSupportActionBar()时报错
在Activity中,使用setSupportActionBar()
时报错,如图所示。
原因:设置Toolbar时,如果系统检测到有ActionBar,则会报错。
解决方法:去掉ActionBar即可,加上下面这几行代码:
四.在Fragment中创建ActionBar菜单
解决方法:在Fragment的onCreateView中加上如下方法。
五.setDisplayHomeAsUpEnabled()与setDisplayShowHomeEnabled()区别
setDisplayHomeAsUpEnabled(true) // 给左上角图标的左边加上一个返回的图标 。对应ActionBar.DISPLAY_HOME_AS_UP
setDisplayShowHomeEnabled(true) //选择左上角图标是否显示,如果设成false,则没有程序图标,仅仅就个标题,否则,显示应用程序图标,对应id为android.R.id.home,对应ActionBar.DISPLAY_SHOW_HOME
六.VisibleForTesting
@VisibleForTesting
注解一个类,方法,变量,表示它有更宽松的可见性,使代码可以被测试。也就说为了测试方便,提高了可见性。
七.Mainfest merger failed
按照建议添加tools:replace="android:appComponentFactory"
后还是报错,如下所示:
可以看到的是错误主要是在Manifest中,所以我们在Google提供的Gradle工具中找到这个processDebugManifest
。·侧边栏Gradle
-app
-Tasks
-other
-processDebugManifest
。这个可以帮助我们查看错误信息,并给出解决方法。
想查看更多的信息,可以输入gradlew processDebugManifest --stacktrace
。
在AndroidManifest的application节点下输入这一行。
android:appComponentFactory="ToDo"
但是,输入这几行之后,项目还是会报错,本质上是support包与androidx包无法共存。所以我们需要将引用的support包转成androidx包。
首先,在gradle.properties
下输入这两行代码
android.enableJetifier=true
android.useAndroidX=true
然后,选择AndroidStudio中的Refactor
标题栏,点击下面的Mrigrate to AndroidX
,选择将项目转换为AndroidX项目,同时会选择将当前项目保存为压缩包。
最后,在Activity类,Fragment等类中将引用的support类包删掉,换成androidx包即可。在xml文件中,widget也要换成androidx包的,否则运行中会报错。同时,刚开始在AndoridManifest.xml中添加的几行代码是无效的,删掉。
八.Schema export directory is not provided to the annotation processor so we cannot export the schema. You can either provide room.schemaLocation
annotation processor argument OR set exportSchema to false.
exportSachma = false;
@Database(entities = { YourEntity.class }, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
...
}
九.屏幕旋转后,Activity之间使用的Intent传递的数据
在ActivityA向ActivityB传递数据后,在ActivityB界面,屏幕旋转,ActivityB会重启,重新调用生命周期,可以再次接受到ActivityA传递来的数据。
十.确定按钮被输入法挡住
类似于这种情况,先输入标题,然后再输入内容。但是在输入内容时,输入法栏出现,挡住了确定的按钮,为了点击确定,需要关闭输入法,然后再点击确定,体验极其差。在这种情况下,可以给布局的外围加一个ScrollView,当输入法出现时,布局向上滑动,确定按钮也跑到了上面,解决了确定按钮被输入法挡住的问题。效果如下图所示。