一、问题引入
今天在写博学谷项目课程界面时发现如下错误:
'CourseView(android.support.v4.app.FragmentActivity)' in 'com.boxuegu.View.CourseView' cannot be applied to '(com.boxuegu.activity.MainActivity)'
二、问题分析
查看CourseView.java中定义的CouseView构造方法,发现其指定的参数类型为FragmentActivity类型,而在MainActivity中this的类型是MainActivity(Activity)。
正常来讲,android FragmentActivity与MainActivity(Activity)是可以自动转化的,
但是有一个重要问题:
我们在写CourseView时使用的FragmentActivity和ViewPager是android.support.v4支持的,而不是MainActivity中的androidx.appcompat.app.AppCompatActivity支持的
CourseView.java
MainActivity.java
我们查看《Android项目实战:博学谷》原书代码中每一个Activity.class的import,都可以发现如下片段:
import android.support.v7.app.AppCompatActivity
而我们使用AndroidStudio默认的Activity引入如下:
import androidx.appcompat.app.AppCompatActivity;
读到这里,你应该已经发现问题所在:
是androidx中Activity与android.support.v7中Activity类型不匹配的问题。
三、问题解决
1.分析原理
解决问题前,我们首先要搞清楚到底为什么android要引入andoridx而逐渐废弃android.support库依赖。
以下取自AndroidX 概览 | Android 开发者 | Android Developers
androidx
命名空间包含 Android Jetpack 库。与支持库一样,androidx
命名空间中的库与 Android 平台分开提供,并向后兼容各个 Android 版本。AndroidX 对原始 Android 支持库进行了重大改进,后者现在已不再维护。
androidx
软件包完全取代了支持库,不仅提供与支持库同等的功能,而且还提供了新的库。此外,AndroidX 还包括以下功能:
写项目过程中我们需要大量引入andorid.support库依赖,这将导致例如库冲突等严重库管理问题,为此android把所有库依赖集成为androidx,以便开发者使用。
2.问题解决思路:
通过把所有如下import替换为androidx(不能手动替换)
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
替换为:
import com.boxuegu.activity.MainActivity;
import androidx.viewpager.widget.ViewPager;
3.操作过程(一定要通过代码补全方式):
3.1修改CourseView.java中的构造函数参数类型为MainActivity
3.2修改CourseView.java中
private FragmentActivity mContext;//广告内容
的类型,android.support.v4.app改为androidx.fragment.app
3.3.修改AdBannerAdapter.java两个构造函数中FragmentManager类型,android.support.v4.app改为androidx.fragment.app
3.4修改AdBannerAdapter类的继承类FragmentStatePagerAdapter的类型,android.support.v4.app改为androidx.fragment.app
3.5修改getItem方法返回值类型,android.support.v4.app改为androidx.fragment.app
3.6修改AdBannerFragment的继承类类型
3.7修改CourseView.java中ViewPager类型
3.8修改adPaper类型
3.9修改OnPageChangeListener的类型
3.10修改main_adbanner.xml中对ViewPager的引用
至此修改完毕。
效果:MainActivity中已无错误提示