Android-атрибут checkMarkGravity CheckedTextView (API 21)

Макет 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" />

Однако я не могу использовать этот атрибут в моем проекте, поскольку я получаю следующую ошибку:

Ошибка:(15) Не найден идентификатор ресурса для атрибута 'checkMarkGravity' в пакете 'android'

Можно ли каким-то образом использовать этот атрибут? Я собираю для API 21, так что все должно быть в порядке:

minSdkVersion 21
targetSdkVersion 21

2 ответа

В течение некоторого времени checkMarkGravity по умолчанию имеет значение END в CheckedTextView. На данный момент CheckedTextView XML-файлы для одиночного и множественного выбора не устанавливают атрибуты галочки. вот что я вижу в первом, например:

<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" />

Таким образом, причина того, что галочка появляется слева, заключается в том, что для рисования галочки установлено значение null, и на самом деле вместо этого устанавливается 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 должен иметь возможность рисования с отслеживанием состояния. Я использовал обычай, но вы могли бы также использовать? Attr / listChoiceIndicatorSingle темы, как исходный файл.

Я не знаю, является ли этот атрибут правильным, но не существует в официальных документах: http://developer.android.com/intl/es/reference/android/widget/CheckedTextView.html

В любом случае значение в этом же проекте отображается в этом файле (строка 2052): https://github.com/android/platform_frameworks_base/blob/59701b9ba5c453e327bc0e6873a9f6ff87a10391/core/res/res/values/symbols.xml

Это правильно. Код фактически использует его, но компилятор не позволяет его использовать. Код есть в нескольких местах, и вот где он инициализируется:

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

И пример использования в XML-файлах макета Android находится в 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 выпустит ее для всех, кто будет ее использовать.

Другие вопросы по тегам