本文主要是介绍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在低版本上不显示问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!