Фон из PreferenceActivity не применяется к вспомогательному экрану - PullRequest
6 голосов
/ 27 января 2010

Я тестирую свое приложение на Nexus One, и у меня есть некоторые проблемы. Моя тема Свет и когда отображается внутренний под PreferenceScreen, фон окна становится черным вместо того, чтобы сохранять значение PreferenceActivity.

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

В чем проблема?

Wouter

Ответы [ 3 ]

2 голосов
/ 06 июля 2012

Используйте это:

Создание темы в файле 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 голос
/ 30 сентября 2014

Вы пробовали это?

    @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.

На комментарий № 35 из этого источника .

1 голос
/ 17 апреля 2012

Чтобы лучше понять, что здесь происходит, вы можете обратиться к этому коду из исходного кода для класса 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 или динамически через код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...