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

相关文章

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH