Android 杂谈零散知识点(持续更新)

https://rainmonth.github.io/posts/A180123.html

[TOC]

  • Q:git访问github的rate limit问题如何解决
    由于现在Github的开放访问有每小时60个请求的限制,很多应用下载、安装、使用过程中会访问Github,导致超限而报错403 rate limit等等。通过授权后,可以提高到每小时5000次。方法是:到github的setting-develop-generate token,创建一个token,然后设置到环境变量中,如下。

Linux
设置环境变量GITHUB_TOKEN,如下:
GITHUB_TOKEN=xxxxxxxxxxxxxxxxxxxxx
注意,如果在shell中执行,需要放到shell脚本里面,因为执行的环境跟当前环境是不同的。

MacOS
设置环境变量HOMEBREW_GITHUB_API_TOKEN,如下:
export HOMEBREW_GITHUB_API_TOKEN=9927d2878ffa105fc5236c762f2fd7zfd28b841d

  • Q:为什么Android的更新试图操作必须在主线程中进行?

    这是因为Android系统中的视图组件并不是线程安全的。通常应该让主线程负责创建、显示和更新UI,启动子线程,停止子线程。让子线程完成计算并向主线程发出更新UI的消息,让主线程来更新UI。这就促使Android中产生了Handler机制。

  • Q:如何更改Android Studio编译所采用的API版本?

    通过module setting 的Flavors选项卡进行Android API编译版本的更改;

未解决

  1. SurfaceView 动画刷新问题;
  2. 圆角边框适配问题,具体表现:在小米手机(Xiaomi MI 8 SE)如果不关闭硬件加速,圆角会出现不干净的情况;在Oppo R7s 上如果关闭硬件加速,就无法切除圆角
  3. 直接使用SimpleDraweeView来实现边框时会出现圆角部分被裁切的情况,而且边框会导致显示的图片显示变小。

自定义模板

  1. Android Studio自定义模板 写页面竟然可以如此轻松
  2. 新建类文件的自定义模板方法
    • File and code template->新建模板,输入名字,选择扩展名,填入模板内容
    • 模板内容中的自定义变量采用${变量}来声明,声明之后会在新建的时候要求你输入,但要注意,这个变量必须是在当前这个模板中声明的,不能是引用自其它模板的自定义变量
    • 模板中可以使用静态文本,也可以使用预设的变量,如${DATE}等。

权限适配问题

  • 索尼手机,debug模式打开webView就崩溃
  • 同一个WebView,多次加载一个包含“#”的地址,如果在“#”后面的参数发生变化而“#”前面内容不变时,WebView不会重新加载

控件问题

  • Group控件设置可见性的时候,存在设置不生效的问题

    解决方法,调用设置可见性之后,调用其提供的updatePreLayout来更新其关联View的可见性。

  • ViewPager(应用PagerTransformer效果)的一页中的子View动画超出边界被裁的问题

    采用在PagerTransformer的transfromPage方法中找到该View,对该View进行动画

  • clipChildren和clipPadding属性的作用

    允许子View超过父View的边界,但有的情况下会失效(比如ViewPager应用了PagerTransformer效果后

  • EditText 的光标为何不显示?

    首先设置cursorVisible属性为true,然后设置textCursorDrawable(背景色与
    控件背景色不要一样),textCursorDrawable属性是在API11才推出的属性;

  • ListView的android:listSelector属性如何使用?

  • TextView 设置按压状态无效过?(但同样的效果应用在Button上却有效果)

    这是因为Button默认是可以点击的,而TextView默认不可点击,只有设置了setOnClickListener后才可点击(或声明android:clickable=true),所以要想看到效果,可以设置点击事件或在xml布局文件中声明android:clickable=true

  • ListView设置android:listSelector无效如何解决

    • 找到为什么无效

    • 采用替代的方法

      首先,在自己实现的Adapter的getView()方法中进行如设置:

      1
      2
      3
      4
      5
      if (position == selectItem) {  
      convertView.setBackgroundColor(Color.RED);
      } else {
      convertView.setBackgroundColor(Color.TRANSPARENT);
      }

      然后,在onItemClick()方法中,进行如下设置:

      1
      2
      adapter.setSelectedItem(position)
      adapter.notifyDatasetInvalidated();
  • 如何对TextView的部分文字进行特定样式设置?

    1. 采用strings.xml文件,即在该文件中利用相应的Html标签对要改变样式的问题进行更改

    2. 采用SpannableStringBuilder类,具体说明:

      该类提供了setSpan(Object what, int start, int end,int flags) 方法,其中的what可以为以下类的实例:
      URLSpan;
      ClickableSpan;
      BackgroundColorSpan;
      ForegroundColorSpan;
      MaskFilterSpan;
      AbsoluteSizeSpan;
      RelativeSizeSpan;
      ImageSpan;
      ScaleXSpan;
      StyleSpan;
      SubscriptSpan;
      SuperscriptSpan;
      TextAppearanceSpan;
      TypefaceSpan;
      RasterizerSpan;
      StrikethroughSpan;
      UnderlineSpan;

      使用方法:
      a、得到SpannableStringBuilder类的实例:builder;
      b、得到Span子类的实例,如ForegroundColorSpan的实例 forgroundColorSpan;
      c、调用setSpan方法,指定要进行样式修饰的起始位置,进行参数填充;
      d、调用TextView的setText(SpannableStringBuilder builder)方法;

  • 滑动控件嵌套问题(如ScrollView中嵌套ViewPager、ScrollView中嵌套RecycleView或ListView等)

    建议不要写这样的嵌套,但实在没办法的时候,我们要对嵌套的控件做处理(可以处理嵌套的控件,也可以处理处理被嵌套的控件)

  • Activity布局文件中界面中的TextView设置的内容不显示?

    这个问题很可能是因为你的Activity布局文件中存在了相同的id。注意Android Studio默认是不允许一个xml文件中出现相同id的,但通过自定义控件的子View、include、merge标签等可能会导致View树上面出现相同id的情况,排查这种情况最有效的方法是通过Tools->Layout Inspector来生成当前界面的View树,然后查看是否有相同的id出现

编译配置问题

  • 升级到Android Studio Hedgehog 以后,老版本项目运行老是包错,各种类不能访问等?

    原因:Android Studio Hedgehog 新增了一个 GRADLE_LOCAL_JAVA_HOME,用于制定当前项目的JDK 路径,默认会只想Android Studio 内置的JDK版本,这个版本与通常 使用的JDK 1.8 版本 不同,它执行的是 Android Studio 内置的 JDK版本(JDK 17),所以就会各种老项目运行不起来,这个是欧之遥制定 gradle 编译时 的JDK版本为 1.8的就可以了;

  • Android Studio 升级后以前的老项目运行报错:com.android.ide.common.signing.KeytoolException: Failed to read key AndroidDebugKey from store "/Users/RandyZhang/.android/debug.keystore": Invalid keystore format

    删除.android目录下的debug.keystore文件,以及相应的.lock文件,然后重启Android Studio即可;

  • Android Studio 升级后项目引用库不能查看java源文件而只能查看.class 文件

    检查下项目采用的gradle插件版本是否较低,3.x.x,可以尝试升级gradle插件版本

  • Android Studio的运行按钮一直不可点问题

Invalidate caches and restart即可

  • DexCount的使用

    官方文档:dexcount-gradle-plugin Android官方查看应用方法数工具

    1. 在项目的更目录的build.gradle 的dependencies节点添加

      classpath ‘com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.8.6’,注意主要在buildScript中添加相应的仓库地址:mavenCentral()

    2. 在app/build.gradle 中应用该插件:

      apply plugin: ‘com.android.application’

      apply plugin: ‘com.getkeepsafe.dexcount’

  • Mac Android Studio打开新项目后出现Connect to 127.0.0.1:8888 [/127.0.0.1] failed: Connection refused (Connectio refused)问题

    首先,检查项目的gradle.property 文件中代理配置;然后,检查系统.gradle文件夹下的gradle.property中的代理配置;这还不行,请关闭所有的翻墙代理软件,然后打开所连接网络的高级设置,去掉所有代理设置,然后请记得重启Android Studio

  • Could not download support-compat.aar

  • Unable to open debugger port (localhost:8617): java.net.ConnectException “连接超时”

    很可能是localhost地址找不到的原因,在hosts中添加:

    127.0.0.1 localhost

    这一行即可

  • mac版eclipse导入Android项目里面的中文乱码问题如何解决?

    1. 在Preference中找到Text File Encoding,选择Other,手动输入GBK即可;
    2. 针对单个文件,选择乱码的文件,右键选择属性,在Text File Encoding中进行修改;
    3. 针对所有的*.java文件,可采用在Eclipse的偏好设置中的General->Content Type->Text->Java Source Files->Default Encoding中进行设置。
  • Android Studio或者Eclipse编译项目时提示Error:java.lang.OutOfMemoryError: GC overhead limit exceeded如何解决?

    解决方法:

    • Android Studio:在项目的build.gradle文件的android节点添加如下代码:

      1
      2
      3
      4
      5
      dexOptions {
      javaMaxHeapSize "2048m"
      // 以下为Android Studio默认值
      // javaMaxHeapSize "256m"
      }
    • Eclipse: 方法同Android Studio,更改eclipse.ini文件的相关配置:

      1
      2
      3
      4
      5
      6
      -Xms40m
      -Xmx512m

      修改为
      -Xms512m
      -Xmx1024m
  • 当打release包的时候,提示如下错误信息时,如何解决?

    Error:Execution failed for task ‘:loggertest:processDebugManifest’. Manifest merger failed : Attribute application@icon value=(@mipmap/iclauncher) from AndroidManifest.xml:7:9-43 is also present at [TuringOSLoggerAPI:app:unspecified] AndroidManifest.xml:16:9-45 value=(@drawable/iclauncher). Suggestion: add ‘tools:replace=”android:icon”‘ to element at AndroidManifest.xml:5:5-18:19 to override.

    解决方案:

    在提示信息中已经给出了,我们只要在主module的application节点添加tools:replace=”属性名”,同时在AndroidManifest.xml的根节点上添加对应的命名空间

    xmlns:tools="http://schemas.android.com/tools"

    注意:多个属性需要用’,’隔开。

  • Android Studio修改apk文件名、修改apk文件输出路径之后,点击run或debug项目提示在app主module的build文件夹下找不到对应的apk文件,导致apk无法安装如何解决?

    解决方案:

    这是因为你当前的构建变体是不允许直接通过Android Studio来运行(或调试)的,此时你只需要在AS的菜单栏上点击Build->Edit Build Types->选择相应的BuildVariants,debuggable属性设置为true即可

  • Android Studio多种构建变体添加applicationIdSuffix后,logcat找不到对应的包名,取而代之的时问号?

    解决方案:

    这同样是因为当前的构建变体是不允许直接通过Android Studio来运行(或调试)的,此时你只需要在AS的菜单栏上点击Build->Edit Build Types->选择相应的BuildVariants,debuggable属性设置为true即可

  • 某个类型的构建变体(BuildVariants)不能调试,提示如下:

    1
    2
    3
    4
    5
    Error running app:
    Cannot debug application from module app on device xxx.
    This application does not have the debuggable attribute enabled in its manifest.
    If you have manually set it in the manifest, then remove it and let the IDE automatically assign it.
    If you are using Gradle, make sure that your current variant is debuggable.

    解决方案:

    • 在Android Studio的BuildVariants选择以Debug结尾的BuildVariants即可(因为Debug结尾的默认是可以调试的)
    • 在Android Studio的build菜单选择Edit Build type,可以配置不同BuildVariants的相关属性
  • Android Studio开启instant run运行项目报如下错误:

    Error:java.io.IOException: Could not delete path ‘/Users/RandyZhang/AndroidStudioProjects/TRJ/app/build/intermediates/instant-run-support/sc-trj/yw/package_directories/dex-renamer-state.txt’

    解决方案:

    • 关闭instant run(不推荐,毕竟instant run还是很好用的)
    • 手动删除对应目录下对应的文件
    • 先debug运行,带run运行(很有效)
  • Android Studio中启动模拟器时提示Emulator: WARNING: HAXM 6.0.1 is installed. Please install HAXM >= 6.2.1 to fix compatibility issues on Mac.如何解决?

    解决方法:

    • 首先查看Android Studio的SDK Manager,看看SDK Tool选项卡下面的Intel X86 Emulator Accelector(HAXM installer)的最新版本是否是installed的状态,如果是,看下一步
    • 在安装的Android SDK目录找到extra文件夹,找到Intel文件夹,点击Hardware_Accelerated_Execution_Manager,找到IntelHAXM_6.2.1.dmg进行手动安装,安装之后最好能重启Android Studio和已经开启的模拟器,即可解决问题
  • 同步项目报错:Android - Gradle “xxx” project refresh failed 如何解决?

    解决方法:

  • 遇到Manifest mergerfailed问题,如下:

    Error:Execution failed for task ‘:vitamio-sample:processDebugManifest’.Manifest merger failed : uses-sdk:minSdkVersion 11 cannot be smaller than version 15 declared in library [io.vov.vitamio:vitamio:4.2.0-SNAPSHOT] /Users/RandyZhang/ AndroidStudioProjects/VitamioBundle/vitamio-sample/build/intermediates/exploded-aar/ io.vov.vitamio/vitamio/4.2.0-SNAPSHOT/AndroidManifest.xml

    解决方法:
    在相应的AndroidManifest文件的manifest标签中加上如下内容:

    xmlns:tools="http://schemas.android.com/tools"

    同时添加以下uses-sdk说明:

    <uses-sdk tools:overrideLibrary="name" />

  • 解决com.android.builder.dexing.DexArchiveBuilderException

    compileOptions {

    sourceCompatibility 1.8

    targetCompatibility 1.8

    }

  • 解决duplicate class的问题 Duplicate class android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat found in modules classes.jar (com.android.support:support-compat:28.0.0) and classes.jar (com.android.support:support-v4:22.0.0)

    configurations {

    all*.exclude group: ‘com.android.support’, module: ‘support-v4’

    }

四大组件问题

  • Activity中应用Fragment进行数据的加载与显示时,第一次进入正常,推出再次进入崩溃?

    出现这种情况的原因可能有以下几点:

    1. 采用getInstance方法获取Fragment的实例,但推出时没有置空,导致Fragment里面的控件不为空,但数据为空,其他地方又没有很好的对这种情况进行处理,导致空指针;
    2. Fragment的生命周期没有管理好
  • Android启动时很长一段时间出现白屏(或黑屏)如何解决?

    to be answered…

  • Android 如何避免软键盘弹出时遮挡住用户交互界面?

    在AndroidManifest.xml中为对应的activity添加android:windowSoftInputMode=”adjustResize”

    NOTE:android:windowSoftInputMode属性说明:

    该属性一般使用在AndroidManifest.xml文件的<activity>...</activity>标签上,可以设置成如下值:

    • stateUnspecified
    • stateUnchanged
    • stateHidden
    • stateAlwaysHidden
    • stateVisible
    • stateAlwaysVisible
    • adjustUnspecified
    • adjustResize
    • adjustPan

    这个属性将会影响两件事情

    1. state,即软键盘的状态,软键盘是否显示;
    2. adjust,即是否调整当前窗口。

WebView问题

  • App 的WebView加载使用了rem为单位的H5页面时,若改变了手机的系统字体大小,会导致央视错乱

    解决方法:

    调用WebView.getSettings().setTextZoom(100)即可。在固定大小的布局中,如果想文字大小不随系统字体改变而改变,应该采用dp为单位(而不是sp)

第三方库常见问题

  • 使用Glide报如下错误如何解决?

    java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity
    com.bumptech.glide.manager.k.b(Unknown Source)
    com.bumptech.glide.manager.k.a(Unknown Source)
    com.bumptech.glide.manager.k.a(Unknown Source)
    com.bumptech.glide.e.b(Unknown Source)

    解决方案:

    先说明一下原因,上面的日志记录已经说得很清楚了,Glide加载图片是和Activity和Fragment的生命周期相关联的,如果Activity已经被销毁,Activity里面Glide加载任务仍在进行,就会抛出上述异常,可以

    参考这篇文章解决问题https://stackoverflow.com/questions/31964737/glide-image-loading-with-application-context/32887693#32887693

其他

  • Q:小米手机更改应用程序图标后,桌面上图标没有什么变化?

    重启后可解决问题;

  • 不要轻易使用Android Studio的Removed unused resources

    因为你的项目中可能引用了一些第三方module,这些module中使用的资源文件可能在主module中声明了,执行该命令如果操作不慎可能会导致资源误删

  • 异步任务成功回调中弹窗,出现BadTokenException?

    原因可能是Activity已经Finish了,但异步任务仍存活,导致BadTokenException发生,解决方式,异步任务中显示Dialog(PopupWindow等时,先判断当前Activity是否finish)

  • Fragment中使用getResources()方法,提示IllegalStateException?

    出现的原因是Fragment还没attach到Activity,就调用了Activity相关的getResource方法,导致IllegalStateException发生,解决方法即使提前判断Fragment是否attach成功,调用isAdded方法进行判断

  • 提示zsh: command not found

    先确定.bash_profile的PATH是否有相应的环境变量,如果有,看看.zshrc的配置文件的User Configuraion 是否包含了source ~/.bash_profile这个配置

    出现的原因是Fragment还没attach到Activity,就调用了Activity相关的getResource方法,导致IllegalStateException发生,解决方法即使提前判断Fragment是否attach成功,调用isAdded方法进行判断

  • Android Studio创建9 patch图透明背景变黑

在AS中右键一个图片创建9 patch图,可能会发现新创建的9 patch图和原图相比,颜色失真,透明背景变黑,无法编辑拉伸和内容区域。

这是因为原图的颜色存储方案是colormap,也就是常说的索引图,AS创建9 patch图的原图的颜色方案需要是RGBA。

如果设计师使用sketch导出图片,似乎默认就会使用colormap,一张RGBA图片使用tinypng压缩,输出的图片同样会转为colormap图片,这也是9 patch图不能使用tinypng压缩的原因。

colormap方案对于颜色数量较少的图片,能显著降低图片大小。

在Mac上,使用file指令可以查看png图片的颜色方案,如果发现是colormap,可以使用Mac的预览中的另存为,勾选上alpha存储即可,会自动转为RGBA图片,此时再使用它创建9 patch图,则一切工作正常。

  • 解决Charles和ShadowSock共存的问题,

请访问链接sanchew.github.io/2017/08/15/charles-shadowsocks/

  • Android configChange属性详细探究

    1. 设置configChange与不设置的影响与区别;
  1. 设置不同configChange属性的不同表现(screenSize、orientation、keyboardHidden的不同影响);

    1. 设置不同configChange属性在不同的系统版本上的表现;
  2. 如何解决configChange对Activity生命周期的影响;

  • java.net.UnknownServiceException: CLEARTEXT communication to wanandroid.com not permitted by network

问题原因就是Android API27以上 限制了明文流量的网络请求,非加密(即非https的)的流量会被系统禁止掉。解决方法:

  1. 如果一定要使用明文通信的话,则可以打开AndroidManifest.xml 文件,在 application 元素中添加:

    android:usesCleartextTraffic="true"

    上面的这种方法不建议使用,只能作为一种临时方案。

  2. 项目改用https请求;

  3. 项目的targetSdkVersion改为27(不包括27)以下;

Android Studio 同步项目失败,但是通过命令行可以正确运行

尝试修改distributionUrl版本和 classPath中的gradle tools 版本即可解决问题

Android Studio 编辑区域代码 无故 报红

  1. Invalidate and Restart
  2. 删除项目根目录下的.idea 和 .gradle文件
  3. 禁用掉部分第三方数据库插件(如查看数据库插件等)

The project uses Gradle 4.6 which is incompatible with Java 11 or newer.

打开设置,Build Tools->Gradle->选择对应Java版本即可

华为平板开启平行世界后,Activity在AndroidManifest.xml声明时如果orientation采用behind,或导致获取到的屏幕方向不准确

解决方案:

  • 关闭平行世界;

  • 慎重指定启动模式,最好不要指定为behind

  • 如果指定成了behind,那么其下面的的Activity要么设置成landscape,要么设置成portrait,不要设置成其他值;