2017-12-26 7 views
0

みなさん、こんにちは!setSingleChoiceItemsの値がアクティビティの終了後に固まらない

私は修正できないような私のアプリには奇妙な問題があります。それは論理エラーでなければならないが、私は何とかそれをキャッチすることができない。ここで

は私のコード

public String[] str={"Disabled","Sound Quality Prefered","Bass Prefered","Battery Prefered",}; 
public int ThemePresetValue = 0; 
private int SelectedThemePresetValue = 0; 

    public void presets() { 
    AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); 
    alertDialog.setTitle("Select Your Sound Preset"); 
    alertDialog.setNegativeButton("Cancel", null); 
    alertDialog.setPositiveButton("Select", themePresetDialogPositiveListener); 
    alertDialog.setSingleChoiceItems(str, ThemePresetValue, PresetListListener); 
    alertDialog.show();} 

DialogInterface.OnClickListener PresetListListener = 
     new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       SelectedThemePresetValue = which; 
      } 
     }; 

DialogInterface.OnClickListener themePresetDialogPositiveListener = 
     new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       mPreset = ""; 
       ThemePresetValue = SelectedThemePresetValue; 

       if (ThemePresetValue == 0) { 
        mPreset = "Disabled"; 
       } else if (ThemePresetValue == 1) { 
        mPreset = "Sound Quality Prefered"; 
       } else if (ThemePresetValue == 2) { 
        mPreset = "Bass Prefered"; 
       } else if (ThemePresetValue == 3) { 
        mPreset = "Battery Prefered"; 
       } 

       if (mPreset.equals("Disabled")) { 
        disabler(); 

       } else if (mPreset.equals("Sound Quality Prefered")) { 
        SoundQPreset(); 

       } else if (mPreset.equals("Bass Prefered")) { 
        bassPreset(); 

       } else if (mPreset.equals("Battery Prefered")) { 
        batteryPreset(); 
       } 
      } 
     }; 

ある問題は、私は、プリセットのいずれかを選択した後、アプリが(MainActivityを再起動または殺さ)マルチタスクから閉じられるまでの選択肢がこだわっていることです。その後、私がアプリケーションを再び開くと、ダイアログの選択が0( "Disabled")に再設定されます。

どうしてですか?解決策はありますか?

答えて

0

はい、それぞれのオブジェクトに対して新しいフィールドが作成され、このオブジェクト(つまりアクティビティ)が破棄されるため、フィールドを保持するメモリも解放されます。したがって、フィールドの寿命はオブジェクトの寿命に拘束されます。継続するには、値をSharedPreferencesに保存するか、一般的にはストレージを書き出すようにしてから、そのアクティビティを破棄してください。 onPause()に設定して、onCreate()またはonResume()コールバックの設定からフェッチします。例:

/*--- Saving ---*/ 

SharedPreferences prefs = 
    getApplicationContext().getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE); 
prefs.edit().putInt(KEY_NAME, VALUE).apply(); 


/*--- Retrieving ---*/ 

int oldValue = 
    getApplicationContext().getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE) 
     .getInt(KEY_NAME, 0); 

PREFERENCES_NAMEは、共有設定ファイルのファイル名です。 KEY_NAMEが鍵となり、保存しておいた値を後で取得します。 VALUEは単に保存する値です。

希望すると便利です。

+1

thanks mate!私はsharedPreferences(私は既にスイッチでそれを使用しています)を使用しなければならないと思っていましたが、正しい実装を知らなかったのです! – androidexpert35

+0

getapplicationContextでnull pointerExcemptionが発生しています... – androidexpert35

+0

@ androidexpert35アクティビティや他のContextのサブクラスから呼び出していることを確認してください。 – user8

1

ユーザーの選択を維持していないため、選択はアクティビティが終了するまでメモリに残ります。たとえば、SharedPreferencesやsqliteを使用してローカルでユーザの選択を保存する必要があります。

アクティビティが再開すると、保存された値を読み取り、選択したオプションを設定できます!

関連する問題