0

Holo.Light と Holo (Dark) を切り替えようとしているので、アプリケーション内のすべてが、ユーザーが設定で設定したテーマに変更されます。

これが行われているいくつかのオープンソースアプリを見てきましたが、私のプロジェクトではうまくいかないようです。これに関する助けがあれば大歓迎です。

DashboardActivity.java 内で実行されている現在の問題は次のとおりです。

「「setTheme(Integer.parseInt( pref.getString(」) に問題があります。

DashboardActivity (更新)

public class DashboardActivity extends Activity {

public static final int THEME_BLACK = R.style.DarkThemeAndroid;
public static final int THEME_WHITE = R.style.LightThemeAndroid;
public static final int THEME_WHITE_BLACK = android.R.style.Theme_Holo_Light_DarkActionBar;

@Override
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
            // I've having issue with the "pref.getString" i've tried "Settings.getString" and get error about needing a getString method is needed in Settings.java
    setTheme(Integer.parseInt( pref.getString("selectedTheme", String.valueOf(R.style.LightThemeAndroid) )));
    setContentView(R.layout.dashboard_layout);
          // the rest of my code
      )
    )

設定が更新されました)

public class Settings extends PreferenceActivity implements
    OnSharedPreferenceChangeListener {

final static String[] mThemeEntries = {
    "Default (Light)", 
    "Dark"
    };
final static String[] mThemeValues = {  
    String.valueOf(R.style.LightThemeAndroid), 
    String.valueOf(R.style.DarkThemeAndroid)
    };
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Loads the XML preferences file.
    addPreferencesFromResource(R.xml.settings);
//  SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getActivity());
    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);


    ListPreference listPref = (ListPreference)findPreference("selectedTheme");

    listPref.setEntries(mThemeEntries);
    listPref.setEntryValues(mThemeValues);

    listPref.setValue( pref.getString("selectedTheme", String.valueOf(mThemeValues[0]) ) );

XML リソース

Themes.xml

 <style name="LightThemeAndroid" parent="android:style/Theme.Holo.Light"> 
   </style>         

 <style name="DarkThemeAndroid" parent="android:style/Theme.Holo">
   </style>

設定.xml

  <ListPreference
android:title="Themes"
android:summary="Change the UI of the application"
android:key="theme"
android:entries="@array/themesReturnValue"
android:entryValues="@array/themesDisplayWord" 
android:defaultValue="Theme1" />

配列.xml

 <string-array name="themesReturnValue">
   <item>Light</item>
    <item>Dark</item>
    <item>LightActionBar</item>
         </string-array>   
<string-array name="themesDisplayWord">
    <item>Theme1</item>
    <item>Theme2</item>
    <item>Theme3</item>
        </string-array>
4

3 に答える 3

0

getTheme()は非静的メソッドであり、(インスタンス変数からではなく) 静的な方法で呼び出そうとしています。非静的メソッドを呼び出すには、オブジェクトのインスタンスが必要です。また、ドキュメントの状態

これは、コンテキストでビューがインスタンス化される前に呼び出す必要があることに注意してください (たとえば、setContentView(View) または inflate(int, ViewGroup) を呼び出す前)。

ドキュメント

于 2013-01-15T03:24:15.870 に答える
0

Theme オブジェクト型を返すContextThemeWrapperクラスの非静的 getTheme() メソッドが存在します。getTheme() メソッドの名前を getThe() などの別の名前に変更すれば問題ありません。

于 2013-01-15T03:28:48.950 に答える
0

最初に codeMagic が言ったように、非静的な方法で getTheme を呼び出しています。テーマ関連の定数も 1 つのクラスに入れます。getTheme を静的メソッドにしてみてください (ただし、テーマのためだけに別のクラスを作成する可能性があります)。それとは別に、これは私が2日前に取り組んでいた解決策です。これは、より動的な流動的なテーマ設定への回答について、Googleまたはここのどこにも見つからなかったためです.

好みの断片 (あなたの場合はアクティビティ) から始めます。次に、テーマと値を配列に宣言します...

public class LayoutFragment extends PreferenceFragment {

final static String[] mThemeEntries = {
    "Default (Light)", 
    "Dark"
    };
final static String[] mThemeValues = {  
    String.valueOf(R.style.Theme_Default), 
    String.valueOf(R.style.Theme_Dark)
    };

次に、oncreate メソッドでこれらの値を設定します (注、xml ではこれらの値を設定せず、xml ファイルにはこれらの値への参照はありません)。

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);                 
    addPreferencesFromResource(R.xml.pref_layout);
    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getActivity());

    ListPreference listPref = (ListPreference)findPreference("selectedTheme");

    listPref.setEntries(mThemeEntries);
    listPref.setEntryValues(mThemeValues);

    listPref.setValue( pref.getString("selectedTheme", String.valueOf(mThemeValues[0]) ) );

}

これらの値を文字列に変換したことに注意してください。理由は聞かないでください。ただし、これらのリソース ID の int 値を保存しようとすると、非常に多くの問題が発生していました (これが、xml 値がオプションではなかった理由でもあります)...

ユーザー設定からテーマを設定する必要があるときはいつでも...呼び出すだけです

setTheme(Integer.parseInt( pref.getString("selectedTheme", String.valueOf(R.style.Theme_Default) )));

もちろん、アクティビティごとに記述することなく、キャストなどを行う静的メソッドをどこかに提供することもできます。

編集:配列を静的にする必要はありません。動作させるためにさまざまなことを試みている間、配列をそのままにしておかなければなりません。

于 2013-01-22T15:16:36.120 に答える