为什么你配置不好support.v7库
其实搜索android.support.v7的配置,百度上会出来很多回答。但是按照教程上面走了,其实也配置不好support.v7库。这是为什么呢?其实不一定是教程错,也不一定是你跟错,而是教程太老了,和你的Android Studio版本相差太大。
现在(我写博客的日期是2020.3.1)Android Studio是默认使用androix的,引起导入support.v7库不起作用的根本原因是下面这两句话,但是现在很多博客根本没有提到这点。要配置support.v7库,必须将其注释(配置support.v7完整过程请往后看):
下面我们介绍两种遇到support.v7库报错的解决方法吧。
佛系做法——直接使用androidx
我们遇到support.v7库的情况通常分为两种:
- 在github之类的地方拷下来了别人的整个工程,其中包含support.v7库。这种情况直接打开工程等待项目Sync完成就行了(注意要联网,联网后Android Studio会帮我们自动下载很多需要的依赖)。
- 在教程、书本中读到和support.v7库相关的程序片段。这个其实也好办,直接把对应的support.v7库中的内容换成androidx中对应的内容就行了。具体的替换方法:
-
在
Java代码
中,删除所有与v7相关的import项,然后四处Alt + Enter, 系统会给你自动androix中对应的import项。比如,删除本行:import android.support.v7.app.AppCompatActivity;
Alt + Enter后系统会加上:
import androidx.appcompat.app.AppCompatActivity;
-
在
xml代码
中,也是同样的方法,替换。直接删除原有控件名称,再输入时,系统就会自动提示androidx中对应的控件。比如,我将support.v7库中的Toolbar控件直接粘贴到使用androidx的项目中,控件是灰色的,说明不能用。
删除原有的控件名(android.support.v7.widget.Toolbar),输入Toolbar,直接Enter选择系统提供的Toolbar控件。
变白了,说明现在的控件是正确的,得到了替换。
强烈推荐直接使用androidx中的控件替换v7库中的控件,反正v7有的anroidx都有,而且v7库已经比较老了。。。不过如果你一定要配置好v7库的话,那么请往下看吧。
注意
:support.v7库中的控件所用函数会和androidx中稍有不同。
折腾做法——support.v7库的配置
我使用的Android Studio版本如图所示,最个版本的已经默认使用androidx中的控件了。下面我们来禁用androidx,配置support.v7。
- 首先新建一个项目,这里就叫做TestSupportV7吧。
- 尝试在项目中import android.support.v7相关的库,失败,这个时候可以看到是不行的。
- 找到app目录下的build.gradle,替换dependencies{}中的内容。
原始的dependencies{}中有很多和androidx相关的内容,我们将其删掉:
用下面的内容替换:(顺带提一下,大家在网上可能会看到有用compile而不是implementation的,这可能是早期的设置,现在没有用compile的了)
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
替换后内容如下,记得点击“Sync Now”更新依赖。
4. 这时候会发现support.v7库那一行标红。这是因为support.v7库能够支持的最高的sdkVersion为28,而我们现在项目中的是29。将build.gradle中android{}标签中的29都换成28即可。
5. 很多教程进行到上一步就停止了,但是我们尝试在Activity中导入support.v7库,系统仍然不会有自动提示,说明实际上配置没有成功。
6. 这时候就用到我们一开始说的能够根本原因——现在的Android Studio是默认使用androidx的,我们需要将androidx禁用才可以是使用v7库。打开gradle.properties,并注释下面两句话即可达到目的。
最后Sync Now:
7. 尝试导入v7库,成功。这时其实v7库的导入已经成功了。
8. 最后删除项目中一些标红的、和androidx有关的部分即可。
这里有个比较隐蔽的错误,ConstrainLayout也是与androidx有关的控件,我们前面设置dependencies已经把他的依赖删除了,所以下图中界面呈现灰色(不可用),需要换成别的控件。否则即使没报错也会出错。
可以把最外层控件换成LinearLayout或者别的;下面打x的是ConstrainLayout中的特有属性,不报错,但是也需要删除:
10. 删完和androix相关的那些我们就可以运行程序啦:
最后分享一下自己之前用support.v7库的时候的一些dependencies设置吧。并非必须的设置,加进去用support.v7库写界面会比较方便。当然我们也说了,现在当然推荐默认的androidx啦。
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation 'com.android.support:design:28.0.0'
implementation 'de.hdodenhof:circleimageview:3.1.0'
implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'com.android.support:cardview-v7:28.0.0'
implementation 'com.github.bumptech.glide:glide:3.7.0'
}