Android AppCompatCheckBox在低版本上不显示问题

2024-09-02 20:58

本文主要是介绍Android AppCompatCheckBox在低版本上不显示问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

遇到一个问题,AppCompatCheckBox 在低版本显示不出来,但是在高版本可以显示出来。但是呢,应用的其他页面的AppCompatCheckBox 在同样的低版本手机上可以显示出来。

如下:

高版本可以显示

在这里插入图片描述

低版本不显示勾选框:

在这里插入图片描述
然后我就来回试,我google 了一下,看到有说,需要把当前的activity 继承自AppCompatActivity, 当然,当前我的activity 不是继承自AppCompatActivity。但是用的是AppCompat的Theme。

好,我换成AppCompatActivity 还是不行。

我发现当前的activity 在onCreate 的时候,有过重新设置Theme。难道是这里的问题,好,那我把你onCreate 里面设置Theme 的代码注释掉。发现还是不行。

无奈今天要转版本,可能没有时间去查原因,那么就走另一条路吧。通过适配低版本,解决。

解决方案一:

因为这个布局的 AppCompatCheckBox 在低版本显示不出来勾选框,只有文字,但是把AppCompatCheckBox 改成CheckBox 就可以正常显示,只不过样式不是AppCompatCheckBox的样子。
既然这样,那么,我在低版本手机上,布局里面用CheckBox ,在高版本上用AppCompatCheckBox,同时,低版本的CheckBox 设置一下button 的图片,和高版本一样就行。

OK,res/layout-V11 低版本的布局如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/delete_source_id"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"><TextViewandroid:id="@+id/delete_source_show"android:layout_width="wrap_content"android:layout_height="wrap_content"style="@style/alert_dialog_center_style"android:textColor="@color/color_common_text_primary"android:textSize="@dimen/font_size_medium_"android:text="@string/zz_net_warn"/><CheckBoxandroid:id="@+id/delete_source_checkbox"android:layout_width="wrap_content"android:layout_height="wrap_content"android:checked="false"style="@style/alert_dialog_center_style"android:layout_marginLeft="18dp"android:layout_marginTop="0dp"android:focusable="false"android:textColor="@color/color_common_text_primary"android:textSize="@dimen/font_size_medium_"android:theme="@style/zyCheckBox"android:button="@drawable/button_check_sony"android:focusableInTouchMode="true"/></LinearLayout>

可以看到,我设置了CheckBox 的样式: android:button="@drawable/button_check_sony"

在res/laoyut-V21 下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/delete_source_id"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"><TextViewandroid:id="@+id/delete_source_show"android:layout_width="wrap_content"android:layout_height="wrap_content"style="@style/alert_dialog_center_style"android:textColor="@color/color_common_text_primary"android:textSize="@dimen/font_size_medium_"android:text="@string/zz_net_warn"/><com.zhangyue.iReader.View.box.ZyCheckBoxandroid:id="@+id/delete_source_checkbox"android:layout_width="wrap_content"android:layout_height="wrap_content"android:checked="false"style="@style/alert_dialog_center_style"android:layout_marginLeft="18dp"android:layout_marginTop="0dp"android:focusable="false"android:textColor="@color/color_common_text_primary"android:textSize="@dimen/font_size_medium_"android:theme="@style/zyCheckBox"android:focusableInTouchMode="true"/></LinearLayout>

可以看到,直接使用AppCompatCheckBox。

因为v11 表示11之后的版本,都会采用这个资源文件夹的东西。v21 表示21之后的版本,会采用这个资源文件夹的资源。所以,这样就完美解决了。

但是,这样解决了问题,还是没有找到问题的关键!后来我花时间看,终于找到了问题的关键:

解决方案二:

我在想,为什么同一个app, 同样的手机,为什么有的页面可以正常显示AppCompatCheckBox?这个页面就不可以?

OK, 我把两个Activity用同样的Theme. 什么都搞成一样,还是这个页面不显示,那个可以。那就看代码吧:

不可以的:

AlertDialogController dialogControl = new AlertDialogController();LayoutInflater inflater = LayoutInflater.from(APP.getAppContext());@SuppressLint("InflateParams") ViewGroup viewGroup = (ViewGroup) inflater.inflate(R.layout.alert_net_warn, null);TextView textView = viewGroup.findViewById(R.id.delete_source_show);

可以的:

AlertDialogController dialogControl = ((ActivityBase) activity).getAlertDialogController();LayoutInflater inflater = LayoutInflater.from(activity);@SuppressLint("InflateParams") final ViewGroup viewGroup = (ViewGroup) inflater.inflate(R.layout.alert_delete_base, null);Util.applyAlertDialogCenterMargin(viewGroup);

我擦,一个是LayoutInflater.from(activity); 一个是 LayoutInflater.from(APP.getAppContext())
注:我们代码里APP.getAppContext() 相当于getApplicationContext!

原来是这个,好吧。才疏学浅。这两个加载出来的布局确实不一样,一个会有当前的theme,一个没有。加载布局,尤其是dialog 怎么能用getApplicationContext 呢?好坑。
当然,具体为什么,还需要后续了解下。加油。

总结 :

1.layout-v11 在低版本的手机上用CheckBox,在高版本上用AppCompatCheckBox。
低版本设置一个和 高版本一样的背景图。
2.加载布局的时候,LayoutInflater.from(activity) 一定要传Activity ,因为ApplicationContext 会有很多问题。比如没有主题等。

后续要做:

研究LayoutInflater.from(activity);LayoutInflater.from(getApplicationContext ) 为什么不一样!

参考:
https://stackoverflow.com/questions/35685017/appcompatcheckbox-not-working-for-below-api-21

这篇关于Android AppCompatCheckBox在低版本上不显示问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1131054

相关文章

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Java死锁问题解决方案及示例详解

《Java死锁问题解决方案及示例详解》死锁是指两个或多个线程因争夺资源而相互等待,导致所有线程都无法继续执行的一种状态,本文给大家详细介绍了Java死锁问题解决方案详解及实践样例,需要的朋友可以参考下... 目录1、简述死锁的四个必要条件:2、死锁示例代码3、如何检测死锁?3.1 使用 jstack3.2

解决JSONField、JsonProperty不生效的问题

《解决JSONField、JsonProperty不生效的问题》:本文主要介绍解决JSONField、JsonProperty不生效的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录jsONField、JsonProperty不生效javascript问题排查总结JSONField

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

springboot加载不到nacos配置中心的配置问题处理

《springboot加载不到nacos配置中心的配置问题处理》:本文主要介绍springboot加载不到nacos配置中心的配置问题处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录springboot加载不到nacos配置中心的配置两种可能Spring Boot 版本Nacos

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.