如何包装首选项标题? (真)

时间:2013-10-27 08:53:27

标签: android android-preferences

请不要指向How to wrap preference title?,因为它不适用于(正如我评论)您使用@strings/ strings.xml 文件。

如果您使用

android:title="@string/some_string"

并放

<string name="some_string">the string I want \n to wrap</string>

进入 strings.xml \n将被忽略。

3 个答案:

答案 0 :(得分:4)

对于大多数Android版本,没有公开的API允许首选项标题上的换行。这导致不幸的常见错误,即中长标题上的文本被截断/褪色,尤其是在纵向显示的小屏幕设备上:

<PreferenceScreen
    android:key="my_pref_key"
    android:title="A Long Preference Title that should wrap to multiple lines" />

Before - Single-line preference titles, in Holo and Material Theme

但是有两种解决方法:

1。简单方法-但这仅适用于Android 8(API 26)及更高版本:

像这样使用android:singleLineTitle="false"

<PreferenceScreen
    android:key="my_pref_key"
    android:title="A Long Preference Title that should wrap to multiple lines"
    android:singleLineTitle="false" />

2。困难的方法-自定义首选项子布局-适用于所有Android版本:

对于具有长标题的首选项,请在其上使用自定义布局like this),其中 TextView已明确关闭单行文本。但是您必须以编程方式设置布局,因为主题在Android 4(Holo主题)和Android 5及更高版本(Material主题)之间是不同的。

SettingsFragment.java SettingsActivity.java:

PreferenceScreen myPreferenceItem = (PreferenceScreen)
    getPreferenceScreen().findPreference("my_pref_key");

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    myPreferenceItem.
        setLayoutResource(R.layout.preference_child_material_customized);
} else {
    myPreferenceItem.
        setLayoutResource(R.layout.preference_child_holo_customized);
}

After - Multi-line preference titles, in Holo and Material Theme

res/layout/preference_child_material_customized.xml:的示例

从您的Android SDK /平台/ android-22 / data / res / layout /复制此文件 preference_child_material.xml like this one)并对其进行自定义:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginStart="?android:attr/listPreferredItemPaddingStart"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:gravity="center_vertical"
    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">

    <LinearLayout
        android:id="@+android:id/icon_frame"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:minWidth="40dip"
        android:gravity="start|center_vertical"
        android:orientation="horizontal">
        <ImageView
            android:id="@+android:id/icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="8dip" />
    </LinearLayout>

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:paddingTop="16dip"
        android:paddingBottom="16dip">

        <TextView android:id="@+android:id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:singleLine="false"
            android:textAppearance="?android:attr/textAppearanceListItem" />

        <TextView android:id="@+android:id/summary"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@android:id/title"
            android:layout_alignStart="@android:id/title"
            android:textAppearance="?android:attr/textAppearanceListItemSecondary"
            android:textColor="?android:attr/textColorSecondary"
            android:maxLines="10" />

    </RelativeLayout>

    <!-- Preference should place its actual preference widget here. -->
    <LinearLayout android:id="@+android:id/widget_frame"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:minWidth="58dip"
        android:gravity="end|center_vertical"
        android:orientation="vertical" />

</LinearLayout>

注意TextView上的行 android:singleLine="false"

对于res/layout/preference_child_holo_customized.xml,您应该从Android SDK / platforms / android-19 / data / res / layout / preference_child.xml preference_child_holo.xml like this one),并以类似的方式对其进行自定义。

答案 1 :(得分:1)

我认为所有title内部首选项屏幕都应该是单行
我不认为声明android:title="The title of this preference\nis this."会起作用。这也将忽略\n

所以,我的建议是,制作标题单行并做一个摘要来描述它。

<CheckBoxPreference android:key="extention"
    android:title="@string/title"
    android:summary="@string/summary"
    android:defaultValue="true"
    />

注意:\n适用于摘要

答案 2 :(得分:1)

您可以将app:singleLineTitle="false"androidx.preference:preference一起使用,例如:

<SwitchPreferenceCompat
        app:defaultValue="false"
        app:iconSpaceReserved="false"
        app:key="important_switch"
        app:singleLineTitle="false"
        app:title="@string/pref_switch_title" />