2011-11-09 13 views
1

編集: OKこのコードは、多かれ少なかれ私が変更しようとしていたブール値をリセットする行に残っていたことが判明しました。しかし、皆さん、助けをありがとう。アレイで共有環境設定を使用する

アプリの起動時にSharedPreferencesを使用して保存された配列データを読み込むのに問題があります。 私の_dPadブール値と私の_FreePlay整数は、私の_rendererとの間で何の問題もなくロード、セーブ、パスします。

トラブルは、私がしようとしたときに開始され、いくつかの配列に easteregg[]を使用するだけなので、明らかに私はちょうど別の変数にそれらを回すことができるが、私は長い長さのよりアラスを追加したいので、これは便利なテストの例になり、今2つのエントリがあります。

私はデータを読み取るために(easteregg[]設定だけで変更されているようには見えない)

が起こると思われるもののコードに注意しました:

// Read saved preferences  
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 

    _renderer._dPad = prefs.getBoolean("_dPad", false);    // * works ok * 
    _renderer._FreePlay = prefs.getInt("_FreePlay", 1);    // * works ok * 
    _renderer.easteregg[0] = prefs.getBoolean("easteregg[0]", false); // * not working 
    _renderer.easteregg[1] = true;      // * even this is not working 

    setRenderer(_renderer); 

データを書き込むために:

public void onDetachedFromWindow() { 
    super.onDetachedFromWindow(); 

    // As good a time as any to save current config 
    save = false ; // don't commit if nothing changed. 

    SharedPreferences prefs =      
    PreferenceManager.getDefaultSharedPreferences(getContext()); 
    SharedPreferences.Editor editor = prefs.edit(); 

    if (_renderer._dPad != prefs.getBoolean("_dPad",false)){ save = true ; 
    editor.putBoolean("_dPad", _renderer._dPad);} 

    if (_renderer._FreePlay != prefs.getInt("_FreePlay",1)){ save = true ; 
    editor.putInt("_FreePlay", _renderer._FreePlay);} 

    editor.putBoolean("easteregg[0]", _renderer.easteregg[0]); 

    editor.putBoolean("easteregg[1]", _renderer.easteregg[1]); 

    if (save == true){editor.commit();} 

} 

そして.rendererクラスで

// START SAVE DATA 
    public boolean _dPad ; // false no Virtual Pad  *Works Fine* 
    public int _FreePlay ; // 1 = no free play  *Works Fine* 
    public boolean[] easteregg = new boolean[2];  *Values don't load or save* 
    //public boolean easteregg[]; // tried this first *CAUSES CRASH* 
    // END SAVE DATA 

配列を文字列に変換する必要がありますか?私はそれらを変更する方法を取得しません。

+0

ブール値は、特に宣言されていない場合はデフォルトで「false」です。ある時点で値を変更してもよろしいですか?ログステートメントを保存する前と取得した後で印刷してください。 –

+0

私は「_renderer.easteregg [1] = true;」と表示されていますが、私はそれがコード内のどこかで変更されていないことを知っています。なぜなら、私が "public boolean [] easteregg = new boolean [2];" 「public boolean easteregg []; = {true、true}」に設定すると、値は確実にtrueになります。 – MarbleMad

答えて

1

あなたのコードを簡単なアクティビティに入れて、上のようにレンダラークラスのシェルだけを作成し、save booleanがfalseであることを確認して、環境設定をコミットしません。

私は実際に保存を強制し、それを使って遊んで、すべてがそこからうまくいった。

他の設定と同じように、イースターエッグに小切手を追加することをおすすめします。現在の値が保存された値と同じかどうかを確認し、保存されていない場合は保存フラグを設定します。

0

配列を1つの変数に文字列として保存することをお勧めします。あなたはブール値の配列を持っているようです。それをループしてints(0、1)か文字列 "true"か "false"のいずれかにし、それをintまたはstringに保存します。

あなたの設定名に角括弧が含まれている可能性があります。キー値の名前では、キー名は有効な変数名でなければならないと思います。変数名には大括弧は使用できません。

しかし、私はこれもエラーをスローすると思います。あなたは "easteregg_01"と "easteregg_02"という名前を付けても、コードは機能しますか?

+0

プリファレンスキーには、任意の有効な文字列を使用できます。すべての彼のイースターエッグがブーリアンになる限り、彼のコードに問題はありません(セーブフラグは設定されていません^ _ ^) – Geekswordsman

+0

!良いキャッチオクの兄弟。そしてキーネーミングの答えに感謝します。私はキー "4 * $ =スロー(新しいエラー()):%8347"を書くことができて狂っているようです。しかし、私はそうだと思います。 (そうではありませんが、私は可能です) –

+0

:-)ああ、コード断片を表示する危険性。保存フラグが設定されています – MarbleMad

0

最適な解決策は、配列をJSON文字列に変換し、それを環境設定値として保存することです。少量のデータがある場合は、Androidで提供されるorg.jsonクラスを使用することもできます。より多くのデータがある場合、GSONプル・パーサーは、プル・パーサを使用するので、より良いでしょう。そして、あなたは本当に怠け者であれば、あなたは私の小さなデータバインディングライブラリを取得し、実行します。

String jsonState = preferences.getString(GAME_STATE, null); 
StateStorage storage = JSONUnmarshaller.unmarshall(new JsonReader(new    
        StringReader(jsonState)), StateStorage.class); 

、それはあなたのためのJavaクラスをインスタンス化し、データを記入します。そして、保存します

SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit(); 
StringWriter writer = new StringWriter(); 
JsonWriter jsonWriter = new JsonWriter(writer); 

JSONMarshaller.marshall(jsonWriter, ss); 
editor.putString(GAME_STATE, writer.toString()); 
editor.commit(); 

データバインディングライブラリがgithubの上で利用可能である、またはMavenの中心から:

https://github.com/ko5tik/jsonserializer

PS:モーメントはプリミティブだけで、現時点では私は(嗜好値の注入に取り組みます): https://github.com/ko5tik/andject

関連する問題