Android 首选项活动的背景不应用于子首选项屏幕

Android 首选项活动的背景不应用于子首选项屏幕,android,background,Android,Background,我正在NexusOne上测试我的应用程序,我遇到了一些问题。我的主题是轻快 当显示内部子首选项屏幕时,窗口背景 变为黑色,而不是保留首选项活动的黑色 <PreferenceScreen android:title="main preferences"> ... <PreferenceScreen android:title="sub screen"> </PreferenceScreen> </PreferenceScreen&g

我正在NexusOne上测试我的应用程序,我遇到了一些问题。我的主题是轻快 当显示内部子首选项屏幕时,窗口背景 变为黑色,而不是保留首选项活动的黑色

<PreferenceScreen android:title="main preferences">
    ...
    <PreferenceScreen android:title="sub screen">
    </PreferenceScreen>
</PreferenceScreen>

...
有什么问题


Wouter

为了更好地理解这里发生的事情,您可以参考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();
    }
我解决这个问题的方法是通过在添加到首选项屏幕的第一个首选项中覆盖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);
    }
}
然后,您当然需要通过更改xml来使用该自定义类别,即:

<PreferenceScreen android:title="main preferences">
    <PreferenceScreen android:title="sub screen">
    <com.justinbuser.livewallpapers.VideoChooserPreferenceCategory android:title="sub screen category" />
    </PreferenceScreen>
</PreferenceScreen>

此外,如果您注意到android PreferenceScreen会根据是否设置了标题更改主题,即如果存在标题,则会启用包含标题栏的主题。因此,如果您不想要标题栏,您应该避免设置preferencescreen标题,而是以xml静态方式或通过代码动态地设置它。

使用以下方法:

在style.xml文件中创建主题

<style name="Theme.SettingsBackground" parent="@android:style/Theme.NoTitleBar">
<item name="android:windowBackground">@android:color/black</item>
</style>

@android:彩色/黑色
然后在清单文件中使用:

<activity android:name=".Settings" android:theme="@style/Theme.SettingsBackground"></activity>

对您想要的所有子活动执行此操作。

您尝试过此操作吗

    @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference){
        super.onPreferenceTreeClick(preferenceScreen, preference);
        if (preference!=null)
            if (preference instanceof PreferenceScreen)
                if (((PreferenceScreen)preference).getDialog()!=null)
                    ((PreferenceScreen)preference).getDialog().getWindow().getDecorView().setBackgroundDrawable(this.getWindow().getDecorView().getBackground().getConstantState().newDrawable());
        return false;
    }
在您的
首选项活动中添加此方法


在这里的评论#35

你能在添加第二个首选项屏幕之前和之后显示屏幕截图吗?这是我的主要首选项屏幕,所以当我点击“Herineringen”(荷兰语表示通知)时,它会显示这一点(Herineringen旁边没有箭头,应该有一个!)这里有什么问题?你是在加载一个新的活动,还是只是在膨胀和覆盖一个视图?在这里你可以找到我的代码。我刚刚回答了一个类似的问题。看看这个。