Сводное поле тега PreferenceCategory

#android #android-preferences #android-sharedpreferences

#Android #android-настройки #android-общие предпочтения

Вопрос:

Я видел что-то вроде этого:

 <PreferenceCategory xmlns:android="http://schemas.android.com/apk/res/android"
    android:key="vegi_category" android:title="Vegetables"

    android:summary="Preferences related to vegetable">  <!-- Why is this here? -->

    <CheckBoxPreference android:key="tomato_selection_pref"
        android:title="Tomato " android:summary="It's actually a fruit" />
    <CheckBoxPreference android:key="potato_selection_pref"
        android:title="Potato" android:summary="My favorite vegetable" />
</PreferenceCategory>
  

Но я не понимаю, почему существует сводное поле для категории pref:

( android:summary="Preferences related to vegetable" ) ?

Когда я использую предварительный экран, сводка отображается в представлении, но это не относится к предварительной категории. Является ли существование summary в pref category просто условностью, которую можно как-то увидеть?

Каково фактическое использование summary в элементе pref category ?

Ответ №1:

Стандартный виджет PreferenceCategory отображает только заголовок; android:summary атрибут игнорируется.

Это потому, что макет по умолчанию (preference_category.xml ) содержит только одно текстовое представление для поля заголовка:

 <!-- Layout used for PreferenceCategory in a PreferenceActivity. -->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    style="?android:attr/listSeparatorTextViewStyle"
    android:id="@ android:id/title"
/>
  

Если вы хотите также отображать сводку, вы можете указать свой собственный макет, используя android:layout атрибут. Например:

 <PreferenceCategory android:title="Category" android:summary="This is the summary"
                    android:layout="@layout/preference_category_summary">
  

Где layout/preference_category_summary.xml это что-то вроде:

 <!-- Layout used for PreferenceCategory   SUMMARY in a PreferenceActivity. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent" android:layout_height="wrap_content"
              android:orientation="vertical">
    <TextView android:id="@ android:id/title" 
              style="?android:attr/listSeparatorTextViewStyle"/>
    <TextView android:id="@ android:id/summary"
              android:paddingLeft="5dip" android:paddingRight="dip"
              android:layout_width="match_parent" android:layout_height="wrap_content"/>
</LinearLayout>
  

Однако, прежде чем вы продолжите и сделаете это, вы должны подумать, является ли это менее или более запутанным для пользователя. Если вы не будете тщательно стилизовать текст сводки, он либо исчезнет с экрана, либо будет отображаться как привязанный к первому предпочтению в категории.

Ответ №2:

Вы могли бы просто использовать Preference и android:summary.

 <PreferenceCategory xmlns:android="http://schemas.android.com/apk/res/android"
    android:key="vegi_category" android:title="Vegetables">

    <Preference android:summary="Preferences related to vegetable" />

    <CheckBoxPreference android:key="tomato_selection_pref"
        android:title="Tomato " android:summary="It's actually a fruit" />
    <CheckBoxPreference android:key="potato_selection_pref"
        android:title="Potato" android:summary="My favorite vegetable" />
</PreferenceCategory>
  

Комментарии:

1. Я считаю, что это работает очень хорошо (по сравнению с изменением макета; поскольку он также должен соответствовать внешнему виду версии Android). Кроме того, если вы добавите android:selectable=false , вы сможете добиться аналогичного внешнего вида.

Ответ №3:

@ehartwell абсолютно прав
, мои макеты для разных версий:

для предварительного lollipop

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

  <TextView android:id="@android:id/title"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="6dp"
    android:textSize="14sp"
    android:textStyle="bold"
    android:textAllCaps="true"
    android:paddingLeft="8dp"
    android:paddingRight="8dp"/>

  <TextView android:id="@android:id/summary"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="-5dp"
    android:textSize="12sp"
    style="?android:attr/listSeparatorTextViewStyle"/>

</LinearLayout>
  

для post-lollipop

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="@dimen/preference_category_margin"
    android:paddingRight="@dimen/preference_category_margin"
    android:orientation="vertical">

  <TextView android:id="@android:id/title"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="6dp"
    android:textStyle="bold"
    android:textSize="13sp"
    android:textAllCaps="false"
    android:textColor="@color/colorAccent"/>

  <TextView android:id="@android:id/summary"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="12sp"
    android:textColor="@color/colorAccent"
    android:textAllCaps="false"/>

</LinearLayout>
  

@dimen/preference_category_margin отличается для специального размера экрана
16dp или 24dp
, и они довольно хороши 🙂