7

PreferenceActivity を拡張するアクティビティがあります。

私のテーマ: android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen" は、マニフェスト ファイルのアプリケーション レベルに適用されます。

「PreferenceCategory」の「PreferenceScreen」要素を除いて、すべてが目的のテーマを取得しています。彼らはまだデフォルトの黒の背景を持っています. 簡単に言えば、親の設定画面を持つメインの設定カテゴリ画面はテーマを取得していますが、PreferenceScreens のいずれかをクリックして要素の設定 (EditText など) に移動すると、テーマが取得されません...

なぜこれが起こっているのでしょうか?

構造またはpreferences.xmlは次のようなものです:

<PreferenceCategory>

    <PreferenceScreen>
        <EditTextPreference>
        ...
        </EditTextPreference>
        <EditTextPreference>
        ...
        </EditTextPreference>
        ...
    </PreferenceScreen>

    <PreferenceScreen>
    ...
    </PreferenceScreen>

</PreferenceCategory>
4

5 に答える 5

5

最後に、「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:22:55.697 に答える
3

これは以前のAndroidバージョンのバグです(http://code.google.com/p/android/issues/detail?id=4611も参照してください)。

私が正しく覚えていれば、テーマはすべてのAndroid2.xバージョンのPreferenceActivityに適切に適用されていません。これを修正する1つの方法は、色やフォントなどを自分で調整することですが、バグレポートのコメントに記載されている回避策もあります。テーマはAndroid3.0以降で正しく機能するはずです。

于 2012-04-19T13:58:04.157 に答える
3

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

getThemeResId()カスタム テーマを提供するためにアクティビティ (パブリック API から隠されている) のメソッドをオーバーライドするだけでよく、sub-PreferenceScreen は必要なカスタム テーマ リソースを使用するようになったので、これは非常に役立ちます。

/**
 * This is a hack to provide our own theme for the PreferenceScreen's dialog.
 *
 * @see android.preference.PreferenceScreen#showDialog(Bundle)
 */
// NOTE there is no @Override, even though it overrides the Activity method
public int getThemeResId() {
    return R.style.Theme_MyApp_PreferenceScreen;
}

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

        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:33:26.520 に答える
2

他のすべての回答はJavaコードを使用して解決しようとするため、これは私が独自の設定クラスを宣言せずにxmlを完全に使用して解決した方法です。

最初に、設定の完全なレイアウトをここからコピーし、すべてを に変更しまし"@+android:id/xyz""@android:id/xyz"。次に、スタイル ファイルで、新しいスタイルを次のように宣言しました。

<style name="preference">
    <item name="android:layout">@layout/source_preference</item>
</style>

AppTheme に、設定用の新しいエントリが追加されました。

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:textColor">@drawable/text_selector</item>
    <item name="android:preferenceStyle">@style/preference</item>
</style>

この新しいレイアウトでは、必要なすべてのスタイルを設定します。それでおしまい。

于 2016-07-06T16:05:42.157 に答える
0
@Override
public boolean onPreferenceTreeClick(final PreferenceScreen preferenceScreen, final Preference preference) {
    // https://code.google.com/p/android/issues/detail?id=4611 comment #35
    if (preference instanceof PreferenceScreen && ((PreferenceScreen) preference).getDialog() != null)
        ((PreferenceScreen) preference).getDialog().getWindow().getDecorView().setBackgroundColor(Color.parseColor("#ffffff"));

    return super.onPreferenceTreeClick(preferenceScreen, preference);
}
于 2014-01-30T22:03:20.540 に答える