25

こんにちはすべて私はこのようにマニフェストファイルにテーマを設定しました:

android:theme="@android:style/Theme.Light"

しかし、設定アクティビティに問題があります。メインの設定ではテーマは問題なく表示されますが、サブの設定に到達すると、テーマが乱雑になり、本来の白ではなく、すべて暗くなり、フォントが黒なのであまり見えません。アイテムをクリックし始めると、必要に応じて白になることがありますが、すぐに黒に戻ります。これは、実際のデバイスとエミュレーターの両方で、2.1でのみ発生します。1.6を実行しているエミュレータでテストし、正しく機能していました。以下は、preferencesxmlファイルのコードの一部です。

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceScreen
        android:title="@string/account">
        <CheckBoxPreference
            android:key="enable_account"
            android:title="@string/account_use"
            android:summary="@string/account_summ" />
        <EditTextPreference
            android:key="username"
            android:title="@string/login"
            android:dependency="enable_account"
            android:summary="@string/login_summ" />
        <EditTextPreference
            android:key="password"
            android:title="@string/password"
            android:dependency="enable_account"
            android:summary="@string/password_summ"
            android:password="true" />
    </PreferenceScreen>

そしてここにスクリーンショットがあります:

代替テキスト

回避策はありますか?

4

5 に答える 5

15

誰かが回避策をhttp://code.google.com/p/android/issues/detail?id=4611に投稿しました

一言で言えば、トップレベルの設定画面はテーマを認識しているように見えますが、ネストされた画面は認識していません。したがって、回避策では、ネストされたPreferenceScreenのトップレベルのPreferenceActivityを作成してから、インテントを介してこの新しいアクティビティを呼び出すことをお勧めします。

<PreferenceScreen android:key="key1"
                      android:title="1 Item"
                      android:summary="">
        <intent android:action="android.intent.action.VIEW"
                android:targetPackage="com.example"
                android:targetClass="com.example.PreferenceActivity2"/>
</PreferenceScreen>

テーマをアプリケーション自体以外に適用する必要はありませんでした。

于 2011-04-24T18:40:58.210 に答える
4

この手法を使用して、内部設定画面のスタイルをオーバーライドすることもできます。

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

このコードは、メインの設定画面のスタイルをクリックされた設定画面に適用します。

于 2013-04-17T17:28:23.397 に答える
3

ついに私は「PreferenceActivity」のテーマをプログラムで(Javaコードを介して)変更する方法を見つけました

テーマを変更するには、次のようにします。

        @Override
        public void onCreate(Bundle savedInstanceState) {
        setTheme(R.style.Holo_Theme_Light);
        super.onCreate(savedInstanceState);
        }

setTheme(R.style.yourtheme);メソッドの前に常にメソッドを呼び出しますsuper.onCreate(savedInstanceState);。これにより、以下のような結果が得られます。

ここに画像の説明を入力してください

それで全部です。

setTheme(R.style.yourtheme);メソッドの後にメソッドを呼び出すと、次のようなsuper.onCreate(savedInstanceState);結果が得られます。

ここに画像の説明を入力してください

注:テーマは、ネストされたPreferenceScreenでは認識されません。そのネストされたPreferenceScreenにテーマを適用するには、そのネストされたPreferenceScreenに対して別のPreferenceActivityを作成し、setTheme(R.style.yourtheme);そこでメソッドを呼び出す必要があります。

于 2013-03-27T11:11:34.590 に答える
2

これはバグのようです。http://code.google.com/p/android/issues/detail?id=4611を参照してください

于 2010-11-01T21:42:13.617 に答える
0

これを達成するために黒魔術のように見えるものを使用しても大丈夫なら、さらに簡単な解決策があります...

のソースPreferenceScreen#showDialog(Bundle)を見ると、を介して取得したテーマリソースを使用してダイアログが作成され、がでmContext.getThemeResId()使用されていることがわかりますContextThemeWrapper

Contextで使用されているのPreferenceScreenは実際には私たちであるため、これは大幅に役立ちます。したがって、必要なのはメソッド(パブリックAPIから非表示)をPreferenceActivityオーバーライドしgetThemeResId()てカスタムテーマを提供することだけであり、サブPreferenceScreenは現在何でも使用します必要なカスタムテーマリソース!

/**
 * This is a hack to provide our own theme for the PreferenceScreen's dialog.
 *
 * @see android.preference.PreferenceScreen#showDialog(Bundle)
 */
public int getThemeResId() {
    return R.style.Theme_MyApp_PreferenceScreen;
}

このメソッドには注釈が付けられているため、この場合に通常使用される注釈@hideは使用できないことに注意してください。また、メソッド@Overrideを呼び出すこともできません。super.getThemeResId()本当に、これを条件付きでオーバーライドして、フォールバックとしてスーパー実装を呼び出すことができるようにしたい場合、Reflectionを使用してスーパー実装のメソッドにアクセスする必要があります。

        try {
            ((Object) this).getClass().getMethod("getThemeResId").invoke(this);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
于 2014-09-01T21:39:52.070 に答える