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

相关文章

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

element-ui下拉输入框+resetFields无法回显的问题解决

《element-ui下拉输入框+resetFields无法回显的问题解决》本文主要介绍了在使用ElementUI的下拉输入框时,点击重置按钮后输入框无法回显数据的问题,具有一定的参考价值,感兴趣的... 目录描述原因问题重现解决方案方法一方法二总结描述第一次进入页面,不做任何操作,点击重置按钮,再进行下

解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题

《解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题》本文主要讲述了在使用MyBatis和MyBatis-Plus时遇到的绑定异常... 目录myBATis-plus-boot-starpythonter与mybatis-spring-b

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

mysql主从及遇到的问题解决

《mysql主从及遇到的问题解决》本文详细介绍了如何使用Docker配置MySQL主从复制,首先创建了两个文件夹并分别配置了`my.cnf`文件,通过执行脚本启动容器并配置好主从关系,文中还提到了一些... 目录mysql主从及遇到问题解决遇到的问题说明总结mysql主从及遇到问题解决1.基于mysql

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

如何安装HWE内核? Ubuntu安装hwe内核解决硬件太新的问题

《如何安装HWE内核?Ubuntu安装hwe内核解决硬件太新的问题》今天的主角就是hwe内核(hardwareenablementkernel),一般安装的Ubuntu都是初始内核,不能很好地支... 对于追求系统稳定性,又想充分利用最新硬件特性的 Ubuntu 用户来说,HWEXBQgUbdlna(Har

MAVEN3.9.x中301问题及解决方法

《MAVEN3.9.x中301问题及解决方法》本文主要介绍了使用MAVEN3.9.x中301问题及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录01、背景02、现象03、分析原因04、解决方案及验证05、结语本文主要是针对“构建加速”需求交