2017-12-14 1 views
0

共有設定に文字列を書き込もうとしていますが、一見すると動作するようです。アプリの他の部分では、共有の設定にアクセスして文字列を正しく読み取ることができます。共有設定はメモリに保存されますが、ディスクには保存されません

アプリを離れると問題が発生します。共有設定文字列セットのすべてのデータが失われ、空のセットが再び返されます。

アプリが閉じられて再オープンされるまでアクセスできるという事実は、それがメモリに保存されているものの、ディスクには保存されていないと思うようになります。

私はここで多くの答えを読んで、コミットと適用の間で変更しようとしましたが、何が問題の原因かわかりません。

私はそれを保存しようとする方法は、次のとおりです。

  1. は共有優先して、更新のHashSetを保存
  2. のHashSetに新しい文字列を追加し、共有好み
  3. からHashSetのを取得します。ここで

コードです:

public static void storeReminder (Context context, String reminderString){ 

    // Get the set of reminder strings 
    SharedPreferences sharedPreferences = context.getSharedPreferences("AppData", Context.MODE_PRIVATE); 
    Set <String> remindersStringSet = sharedPreferences.getStringSet(context.getResources().getString(R.string.reminders_hashset_key), new HashSet<String>()); 

    // Add the new reminder string to the reminder string set 
    remindersStringSet.add(reminderString); 

    // Save the reminder string set now that the new reminder string has been added 
    SharedPreferences.Editor editor = sharedPreferences.edit(); 
    editor.putStringSet(context.getResources().getString(R.string.reminders_hashset_key), remindersStringSet); 
    editor.commit(); 
} 

そして、これは私がアプリの他の部分に蓄積されたHashSetの取得方法です:

// Get the set of reminder strings 
SharedPreferences sharedPreferences = context.getSharedPreferences("AppData", Context.MODE_PRIVATE); 
Set<String> remindersStringSet = sharedPreferences.getStringSet(context.getResources().getString(R.string.reminders_hashset_key), new HashSet<String>()); 

あなたの助け

を事前に感謝を
+2

あなたは本当にcontext.getSharedPreferences( "AppData"、Context.MODE_PRIVATE)を使用していますか?両方のget/setで? –

+0

はい、確かです。私は私の質問を編集して、私がそれを取り出す場所を含むようにしました。 –

+0

別の名前付き共有環境設定をアプリケーションで使用する特定の理由がない限り、context.getSharedPreferences( "AppData"、Context.MODE_PRIVATE)ではなく、PreferenceManager.getDefaultSharedPreferences(context)としてデフォルト共有設定に切り替えようとします。 – Kubicko

答えて

0

[OK]を保存された設定を保存し、その場所に新しいコピーを追加します。

私はこの記事では答えの一つでそれを見つけた:私はこのように私の記憶コードを変更し、それが正常に動作します

Android: String set preference is not persistent

:助け

ため

public static void storeReminder (Context context, String reminderID, String reminderString){ 

     // Get the set of reminder strings 
     SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); 
     Set <String> remindersStringSet = sharedPreferences.getStringSet(context.getResources().getString(R.string.reminders_hashset_key), new HashSet<String>()); 

     // Add the new reminder string to the reminder string set 
     remindersStringSet.add(reminderString); 

     // Get the shared preferences editor 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 

     // Delete the current set in shared preferences 
     editor.remove(context.getResources().getString(R.string.reminders_hashset_key)); 
     editor.apply(); 

     // Save the NEW version of reminder string set 
     editor.putStringSet(context.getResources().getString(R.string.reminders_hashset_key), new HashSet<String>(remindersStringSet)); 
     editor.apply(); 
    } 

おかげで皆を

0

ログインなどのアプリを開いているときに共有設定をクリアしていないことを確認してください。

+0

はい、アプリ内の共有設定にアクセスする場所は2つだけです。いいえ、それはクリアされていません –

+1

時々、アンドロイドスタジオでインスタント実行は、すべてのインスタント実行のためのアプリのデータをクリア –

0

このクラスを作成します。それぞれの値を設定するか、または取得するための

import android.content.Context; 
import android.content.SharedPreferences; 
import android.preference.PreferenceManager; 

import java.util.Set; 

public class DemoPrefs { 
private SharedPreferences prefs; 
private SharedPreferences.Editor prefs_edit; 
private static DemoPrefs instance; 

public DemoPrefs(Context context) { 
    initialize(context); 
} 

private void initialize(Context context) { 
    prefs = PreferenceManager.getDefaultSharedPreferences(context); 
    prefs_edit = prefs.edit(); 
} 

public static DemoPrefs getInstance(Context context) { 
    if (instance == null) { 
     instance = new DemoPrefs(context); 
    } 
    return instance; 
} 

public void setReminderSet(Set<String> reminderSet) { 
    prefs_edit.putStringSet("reminderSet", reminderSet); 
    clear(); 
    prefs_edit.commit(); 
} 

public Set<String> getReminderSet() { 
    return prefs.getStringSet("reminderSet", null); 
} 

public void clear() { 
    prefs_edit.clear(); 
    prefs_edit.commit(); 
} 
} 

使用SetReminderSet(reminderSet)getReminderSet()方法を。

MainActivity:

public class MainActivity extends AppCompatActivity implements View.OnClickListener { 

private DemoPrefs prefs; 
private EditText editText; 
private Button button; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    initialize(); 
    setListener(); 
} 


private void initialize() { 
    prefs = DemoPrefs.getInstance(this); 
    editText = (EditText) findViewById(R.id.editText); 
    button = (Button) findViewById(R.id.button); 
} 

private void setListener() { 
    button.setOnClickListener(this); 
} 

public void storeReminder(String reminderString) { 
    Set<String> reminderSet = null; 
    if (prefs.getReminderSet() == null) 
     reminderSet = new HashSet<String>(); 
    else 
     reminderSet = prefs.getReminderSet(); 
    reminderSet.add(reminderString); 
    prefs.setReminderSet(reminderSet); 
} 

@Override 
public void onClick(View view) { 
    switch (view.getId()) { 
     case R.id.button: 
      if (!TextUtils.isEmpty(editText.getText().toString().trim())) { 
       if (prefs.getReminderSet() != null) 
        System.out.println("OLD SIZE: " + prefs.getReminderSet().size()); 
       storeReminder("Set: " + editText.getText().toString().trim() + ""); 
       if (prefs.getReminderSet() != null) 
        System.out.println("NEW SIZE: " + prefs.getReminderSet().size()); 
      } else { 
       Toast.makeText(this, "Please enter data", Toast.LENGTH_SHORT).show(); 
      } 
      editText.setText(""); 
      break; 

    } 
} 
} 

activity_main.xml:

あなたはに格納されている文字列のセットを削除する必要があります。私は、原因が何であったかが分かった

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context="com.pairroxz.demoapp.MainActivity"> 

<EditText 
    android:id="@+id/editText" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_marginStart="16dp" 
    android:layout_marginLeft="16dp" 
    android:layout_marginTop="16dp" 
    android:ems="10" 
    android:inputType="textPersonName" 
    app:layout_constraintHorizontal_chainStyle="spread_inside" 
    app:layout_constraintLeft_toLeftOf="parent" 
    app:layout_constraintRight_toLeftOf="@+id/button" 
    app:layout_constraintTop_toTopOf="parent" 
    tools:hint="@string/edit_message" /> 

<Button 
    android:id="@+id/button" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginEnd="16dp" 
    android:layout_marginStart="16dp" 
    android:layout_marginLeft="16dp" 
    android:layout_marginRight="16dp" 
    android:text="@string/button_send" 
    app:layout_constraintBaseline_toBaselineOf="@+id/editText" 
    app:layout_constraintLeft_toRightOf="@+id/editText" 
    app:layout_constraintRight_toRightOf="parent" /> 

</android.support.constraint.ConstraintLayout> 
+0

ありがとう、なぜですか? –

+0

私はアプリケーションを終了した後でも価値を与えているコードを更新しました。まあ、私はこの単純なクラスを使って簡単にし、すべてのものを1か所で管理しています。 実際には、commit()メソッドが次回の値を与えるための作業を行う前にclear()メソッドを呼び出しています。私はそれが正しいことではないことを知っていますが、それは働いています。 –

関連する問題