設為首頁收藏本站

艾歐踢論壇

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

搜索
熱搜: 活動 交友 discuz
查看: 345|回復: 0
打印 上一主題 下一主題

android.support升级到androidx

[複製鏈接]
跳轉到指定樓層
樓主
發表於 2020-4-25 13:58:24 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
1.手动配置gradle.properties
  1. android.enableJetifier=true
  2. android.useAndroidX=true

複製代碼
2.app/build.gradle修改
[td]
修改前android.support修改后androidx
compileimplementation
testCompiletestImplementation
debugCompiledebugImplementation
releaseCompilereleaseImplementation
当然,这部分主要是因为gradle升级后提示需要的更新。
没写全,只写了主要的,Android Studio有提示,根据提示更新就行。
  1. android{
  2.         //省略。。。。
  3.         compileOptions {
  4.             sourceCompatibility JavaVersion.VERSION_1_8
  5.             targetCompatibility JavaVersion.VERSION_1_8
  6.         }
複製代碼
3.java文件修改

这里主要指import的修改,Android Studio自动帮助项目升级成androidx时,很多控件的路径在androidx中都变更了,所以需要全局搜索一键替换。
全局替换: Edit ->Find -> Replace in path
列举了一些常用的:
[td]
修改前android.support修改后androidx
import androidx.appcompat.widget.RecyclerView;import androidx.recyclerview.widget.RecyclerView;
import androidx.core.view.ViewPager;import androidx.viewpager.widget.ViewPager;
import androidx.core.view.PagerAdapter;import androidx.viewpager.widget.PagerAdapter;
import androidx.core.app.Fragment;import androidx.fragment.app.Fragment;
import androidx.core.app.FragmentManager;import androidx.fragment.app.FragmentManager;
import androidx.core.app.FragmentTransaction;import androidx.fragment.app.FragmentTransaction;
import androidx.core.content.LocalBroadcastManager;import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.appcompat.widget.DefaultItemAnimator;import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.appcompat.widget.LinearLayoutManager;import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.appcompat.widget.GridLayoutManager;import androidx.recyclerview.widget.GridLayoutManager;
import androidx.appcompat.widget.StaggeredGridLayoutManager;import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import android.support.design.widget.CoordinatorLayout;import androidx.coordinatorlayout.widget.CoordinatorLayout;
import android.support.design.widget.CoordinatorLayout;import androidx.coordinatorlayout.widget.CoordinatorLayout;
import android.support.design.widget.TabLayout;import com.google.android.material.tabs.TabLayout;
import android.support.design.widget.AppBarLayout;import com.google.android.material.appbar.AppBarLayout
当整个项目因为未生成R文件满江红的时候,全局搜索替换这些常用控件会比较方便。

4.布局文件xml修改

3.java文件修改中罗列了一些控件,同样也是全局搜索把这些对应的控件修改成androidx的就好。
列举几个:
[td]
修改前android.support修改后androidx
<android.support.v4.widget.NestedScrollView/><androidx.core.widget.NestedScrollView/>
<android.support.v4.widget.Space/><Space/>
<android.support.v7.widget.AppCompatTextView/><TextView/>
<androidx.appcompat.widget.CardView/><androidx.cardview.widget.CardView/>
注意!!!
不管是java还是xml也好,在Android Studio全局搜索的情况下还是有可能搜漏,所以可能还是需要挨个文件查看替换。


5.部分view不可用修改
之前手动拷贝了support包中的TabItem(TabLayout需要使用的一个类)出来使用,在升级到androidx后发现无法使用了。
support中的代码:
  1.     public TabItem(Context context, AttributeSet attrs) {
  2.         super(context, attrs);

  3.         final TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs,
  4.                android.support.design.R.styleable.TabItem);
  5.         mText = a.getText(android.support.design.R.styleable.TabItem_android_text);
  6.         mIcon = a.getDrawable(android.support.design.R.styleable.TabItem_android_icon);
  7.         mCustomLayout = a.getResourceId(android.support.design.R.styleable.TabItem_android_layout, 0);
  8.         a.recycle();
  9.     }
複製代碼
a.getText()、a.getDrawable()、a.getResourceId()都报错,提示TintTypedArray.getText()或TintTypedArray.getDrawable()或TintTypedArray.getResourceId()只能在同一个library group(groupId=androidx.appcompat)中被调用,
从TintTypedArray的源码可知,是在源码中做了限制的原因:

  1. @RestrictTo(LIBRARY_GROUP)
  2. public class TintTypedArray {}

複製代碼
6.其他问题
app module所依赖的一些library我也升级到了androidx,在将library中的build.gradle里的compile修改成implementation的时候注意,如果这里依赖的对象需要全局使用的话,就要使用api关键字了。
比如:
  1. 修改前:
  2. dependencies {
  3.     compile fileTree(dir: 'libs', include: ['*.jar'])
  4. }

  5. 修改后:
  6. dependencies {
  7.     api fileTree(dir: 'libs', include: ['*.jar'])
  8. }
複製代碼
7.gradle命令帮助查找问题

8.ISSUES  from logcat
****
[size=100%]E/GnssHAL_GnssInterface: gnssSvStatusCb: a: input svInfo.flags is 8***
[size=100%]         create Virtual Device in AVD manager without GPS sensor.
OR  
[size=100%]There is a much simpler solution. in your AVD simply go to
settings->location
[size=100%] and uncheck

***E/eglCodecCommon: glUtilsParamSize: unknow param***
原因:选择用"host GPU"启动模拟器就会出现这个问题,不是代码的问题。

解决:如果想过滤掉这些错误提示,自定义一个Logcat Filter,在by Log Tag项中填写 ^(?!eglCodecCommon)

ps.这是模拟器的问题,典型的模拟器问题,因为开启了硬件加速,

如果你用的genymotion,它本身依赖一个虚拟机,打开虚拟机,选中你要用的那个模拟器,然后点设置,选系统-硬件加速,关闭即可


****Caused by: java.lang.ClassNotFoundException: androidx.core.view.ViewPager***'

androidx.core.view.ViewPager;  --->androidx.viewpager.widget.ViewPager;
androidx.core.view.PagerTitleStrip;  --->
androidx.viewpager.widget.PagerTitleStrip;

layout.main.xml(src/layout)
  1. <androidx.viewpager.widget.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
  2.     android:id="@+id/pager"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent" >

  5.     <androidx.viewpager.widget.PagerTitleStrip
  6.         android:id="@+id/title"
  7.         android:layout_width="match_parent"
  8.         android:layout_height="wrap_content"
  9.         android:layout_gravity="top"
  10.         android:background="#33B5E5"
  11.         android:paddingBottom="4dp"
  12.         android:paddingTop="4dp"
  13.         android:textSize="20sp"
  14.         android:textColor="#FFFFFF" >
  15.     </androidx.viewpager.widget.PagerTitleStrip>
  16.    

  17. </androidx.viewpager.widget.ViewPager>
複製代碼
build.gradle(app)
add 2 lines
implementation 'com.google.android.material:material:1.1.0'

    implementation 'androidx.viewpager:viewpager:1.0.0'

  1. apply plugin: 'com.android.application'

  2. android {
  3.     compileSdkVersion 29
  4.     buildToolsVersion '29.0.3'

  5.     defaultConfig {
  6.         applicationId "com.refresh.pos"
  7.         minSdkVersion 27
  8.         targetSdkVersion 29
  9.     }

  10.     buildTypes {
  11.         release {
  12.             minifyEnabled false
  13.             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
  14.         }
  15.     }
  16. }

  17. dependencies {
  18.     //noinspection GradleCompatible
  19.     implementation 'androidx.gridlayout:gridlayout:1.0.0'
  20.     implementation 'androidx.legacy:legacy-support-v4:1.0.0'
  21.     implementation files('libs/achartengine-1.1.0.jar')
  22.     implementation files('libs/android-integration-2.0-supportv4.jar')
  23.     implementation 'com.google.android.material:material:1.1.0'
  24.     implementation 'androidx.viewpager:viewpager:1.0.0'
  25. }
複製代碼


https://developer.android.com/re ... et/PagerTitleStrip#
       For androidX support library for viewpager has been replaced with androidx.viewpager:viewpager:1.0.0
       Replace your dependency with this in your gradle.

layout issues


在Android 4.2系统之后,Google在Android中引入了RTL布局,更好了支持了由右到左文字布局的显示,为了更好的兼容RTL布局,
google推荐使用MarginStart和MarginEnd来替代MarginLeft和MarginRight,这样应用可以在正常的屏幕和由右到左显示文字的屏幕上都保持一致的用户体验。
(默认的LTR布局)
RTL布局默认是关闭的,如果想使用RTL布局,首先要在AndroidManifest.xml文件中将<application>标签的android:supportsRtl属性值设为"true",然后需要将相应视图标签的android:layoutDirection属性值设为"rtl"。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 轉播轉播 分享分享 分享淘帖
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

小黑屋|Archiver|手機版|艾歐踢創新工坊    

GMT+8, 2024-6-1 07:36 , Processed in 0.237890 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表