PreferenceActivity的背景不适用于子PreferenceScreen

时间:2010-01-27 14:48:32

标签: android background

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

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

有什么问题?

的Wouter

3 个答案:

答案 0 :(得分:2)

使用此:

在style.xml文件中创建主题

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

然后在清单文件中使用:

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

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

答案 1 :(得分: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();
    }

我解决它的方法是通过在添加到首选项屏幕的第一个首选项中覆盖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根据是否设置了标题来更改主题,即如果标题存在,则启用包含标题栏的主题。因此,如果您不需要标题栏,则应避免设置首选项屏幕标题并在xml中静态设置或通过代码动态设置。

答案 2 :(得分:1)

你试过这个吗?

    @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;
    }

PreferenceActivity

中添加此方法

来自此source的评论#35。