Android CheckedTextView的checkMarkGravity属性 (API 21)

8

平台源代码中的select_dialog_singlechoice_material.xml布局使用了android:checkMarkGravity="start"属性:

<?xml version="1.0" encoding="utf-8"?>
<!--
 Copyright (C) 2014 The Android Open Source Project
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at
      http://www.apache.org/licenses/LICENSE-2.0
 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="?android:attr/textColorAlertDialogListItem"
android:gravity="center_vertical"
android:paddingStart="@dimen/alert_dialog_padding_material"
android:paddingEnd="@dimen/alert_dialog_padding_material"
android:checkMark="?android:attr/listChoiceIndicatorSingle"
android:checkMarkGravity="start"
android:ellipsize="marquee" />

然而,在我的项目中,我无法使用此属性,因为我会收到以下错误:

Error:(15) No resource identifier found for attribute 'checkMarkGravity' in package 'android'

有没有办法以某种方式使用此属性? 我正在编译api 21,所以这应该没问题:

minSdkVersion 21
targetSdkVersion 21

1
这不是公共属性,所以您将无法使用它。 - alanv
3个回答

0

这是正确的。代码实际上使用了它,但编译器不允许使用它。代码在多个地方都有它,并且这里是它被初始化的地方:

public CheckedTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    ....
    mCheckMarkGravity = a.getInt(R.styleable.CheckedTextView_checkMarkGravity, Gravity.END);

而在 Android 的布局 XML 文件中,使用的一个示例是“preference_material.xml”:

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?android:attr/listPreferredItemHeightSmall"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:textColor="?android:attr/textColorAlertDialogListItem"
    android:gravity="center_vertical"
    android:paddingStart="?attr/dialogPreferredPadding"
    android:paddingEnd="?attr/dialogPreferredPadding"
    android:checkMark="?android:attr/listChoiceIndicatorSingle"
    android:checkMarkGravity="start"
    android:ellipsize="marquee" />

我已经在这里写过这个问题,希望Google会发布它供所有人使用。


0

0

checkMarkGravity 在 CheckedTextView 中已经默认为 END 一段时间了。 目前,单选和多选的 XML 文件中的 CheckedTextView 不设置 checkmark 属性。例如,在前者中我看到的是:

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/listPreferredItemHeightSmall"
android:textAppearance="?attr/textAppearanceMedium"
android:textColor="?attr/textColorAlertDialogListItem"
android:gravity="center_vertical"
android:paddingStart="@dimen/select_dialog_padding_start_material"
android:paddingEnd="?attr/dialogPreferredPadding"
android:drawableStart="?attr/listChoiceIndicatorSingle"
android:drawablePadding="@dimen/select_dialog_drawable_padding_start_material"
android:ellipsize="marquee" />

所以复选框显示在左边的原因是,复选框可绘制对象为空,实际上它正在设置drawableStart。如果您要使用自己的XML列表行,则可以设置复选框。

我只在多项选择中发现了这个问题。在我的情况下,单选按钮会显示在最后,但复选框模式会显示在开头。以下是如何通过设置对话框多选项布局来解决此问题:

<style name="AlertDialogTheme" parent="ThemeOverlay.MaterialComponents.MaterialAlertDialog">
    <item name="alertDialogStyle">@style/AlertDialogStyle</item>
</style>
<style name="AlertDialogStyle" parent="MaterialAlertDialog.MaterialComponents">
    <item name="multiChoiceItemLayout">@layout/common_dialog_multichoice_row</item>
</style>

这是布局文件:

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/listPreferredItemHeightSmall"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="?attr/textColorAlertDialogListItem"
android:gravity="center_vertical"
android:paddingStart="@dimen/abc_select_dialog_padding_start_material"
android:paddingEnd="?attr/dialogPreferredPadding"
android:checkMark="@drawable/checkmark_selector"
android:drawablePadding="20dp"
android:ellipsize="marquee" />

在这里,checkmark_selector 需要是一个有状态的 drawable。我使用了自定义的 drawable,但你也可以像原始文件一样使用主题的 ?attr/listChoiceIndicatorSingle。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接