PreferenceActivity的背景不适用于子PreferenceScreen

wou*_*r88 6 android background

我在Nexus One上测试我的应用程序,我遇到了一些问题.我的主题是Light,当显示内部子PreferenceScreen时,窗口背景变为黑色,而不是保持PreferenceActivity的一个.

<PreferenceScreen android:title="main preferences">
    ...
    <PreferenceScreen android:title="sub screen">
    </PreferenceScreen>
</PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)

问题是什么?

沃特

Jus*_*ser 1

为了更好地理解这里发生的情况,您可以参考 PreferenceScreen 类源代码中的这段代码:

 @Override
    protected void onClick() {
        if (getIntent() != null || getPreferenceCount() == 0) {
            return;
        }

        showDialog(null);
    }

    private void showDialog(Bundle state) {
        Context context = getContext();
        ListView listView = new ListView(context);
        bind(listView);

        // Set the title bar if title is available, else no title bar
        final CharSequence title = getTitle();
        Dialog dialog = mDialog = new Dialog(context, TextUtils.isEmpty(title)
                ? com.android.internal.R.style.Theme_NoTitleBar
                : com.android.internal.R.style.Theme);
        dialog.setContentView(listView);
        if (!TextUtils.isEmpty(title)) {
            dialog.setTitle(title);
        }
        dialog.setOnDismissListener(this);
        if (state != null) {
            dialog.onRestoreInstanceState(state);
        }

        // Add the screen to the list of preferences screens opened as dialogs
        getPreferenceManager().addPreferencesScreen(dialog);

        dialog.show();
    }
Run Code Online (Sandbox Code Playgroud)

我解决这个问题的方法是通过覆盖添加到首选项屏幕的第一个首选项中的 onCreateView 来设置父背景颜色。当然,这需要一些自定义代码,但并不是非常复杂,例如设置白色背景:

package com.justinbuser.livewallpapers;

import android.preference.PreferenceCategory;

public class VideoChooserPreferenceCategory extends PreferenceCategory{

    public VideoChooserPreferenceCategory(Context context) {
        super(context);
    }

    @Override
    protected View onCreateView(ViewGroup parent)
    {
        parent.setBackgroundColor(0xFFFFFFFF);
        return super.onCreateView(parent);
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,您需要通过更改 xml 来使用该自定义类别,即:

<PreferenceScreen android:title="main preferences">
    <PreferenceScreen android:title="sub screen">
    <com.justinbuser.livewallpapers.VideoChooserPreferenceCategory android:title="sub screen category" />
    </PreferenceScreen>
</PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)

另外,如果您注意到 android PreferenceScreen 会根据是否设置标题来更改主题,即如果标题存在,它将启用包含标题栏的主题。因此,如果您不想要标题栏,则应避免设置首选项屏幕标题,并在 xml 中静态设置或通过代码动态设置。