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

相关文章

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

如何解决Spring MVC中响应乱码问题

《如何解决SpringMVC中响应乱码问题》:本文主要介绍如何解决SpringMVC中响应乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC最新响应中乱码解决方式以前的解决办法这是比较通用的一种方法总结Spring MVC最新响应中乱码解

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

pip无法安装osgeo失败的问题解决

《pip无法安装osgeo失败的问题解决》本文主要介绍了pip无法安装osgeo失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 进入官方提供的扩展包下载网站寻找版本适配的whl文件注意:要选择cp(python版本)和你py

解决Java中基于GeoTools的Shapefile读取乱码的问题

《解决Java中基于GeoTools的Shapefile读取乱码的问题》本文主要讨论了在使用Java编程语言进行地理信息数据解析时遇到的Shapefile属性信息乱码问题,以及根据不同的编码设置进行属... 目录前言1、Shapefile属性字段编码的情况:一、Shp文件常见的字符集编码1、System编码