2016-10-22 16 views
1

私はAndroid App Developmentの新機能で、コース用にTodoList Appを作成することになっています。しかし、私のコードのSharedPreferenceは機能しません。私はonCreateやonStopのような特定の方法で特定の方法でそれを使用する必要があるかどうかはわかりません。SharedPreferencesは再起動後にすべてのデータを保存しません

それは、ユーザーが永続的に入力している第一の入力を保存しているが、同じ位置に: enter image description here「task0」は私が「putStringの引数として使用されるさまざまな変数名を追跡するために使用するものです「それは、同じセッションで、その後の入力を保存している

addStuff方法では、)の値を置き換えないようにするが、ユーザがそのセッションを終了した場合、すべてのそれらの値の後に 『T』なくなっています。ユーザーがアプリを再起動して別のもの(「g」など)を入力すると、同じ第3位に「g」が保存されます。

私は基本的なJavaの知識を持っており、何が起こっているのか理解しようとしましたが、失敗しました。間違いがどこにあり、どのようにSharedPreferencesを正しく使用するのか教えてください。

public class TodoActivity extends AppCompatActivity { 

public ArrayList<String> items; 
public ArrayAdapter<String> itemsAdapter; 
public ListView list; 
public String s; 
public EditText taskBox; 
public static final String filename = "itemsList"; 
public TextView text; 
public static int counter = 0;//counter starting at 0 no matter what, everytime the app starts 
public String newtask= "task"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_todo); 

    list = (ListView) findViewById(R.id.list1);text = (TextView) findViewById(R.id.text1); 
    taskBox = (EditText) findViewById(R.id.box); 
    s = taskBox.getText().toString(); 

    items = new ArrayList<String>(); 

    itemsAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items); 
    list.setAdapter(itemsAdapter); 

    //add items to list 
    items.add("First Item"); 
    items.add("Second Item"); 

    //restore 
    SharedPreferences sp = this.getSharedPreferences("itemsList", 0); 

    //checking if it stores the previous values, this gives the last input but not the previous ones after restarting the app 
    String dummyname = "task"; 
    text.setText(String.valueOf(counter));//since counter is again at 
    for(int c=0; c<=50; c++){ 
     String num = String.valueOf(c); 
     dummyname = dummyname + num; 
     String x = sp.getString(dummyname, "not found"); 
     if (x.equalsIgnoreCase("not found")){ 
      counter=c-1; 
      break; 
     } else { 
      items.add(x); 
      text.setText(dummyname); 
     } 
    } 

} 

public void addItem(View v){ 
    s = taskBox.getText().toString(); 
    itemsAdapter.add(s);//adding the new task as string 

    String temp = String.valueOf(counter); 
    newtask = "task" + temp; 

    //trying to store the new tasks with different variable names to avoid being replaced 
    text.setText(newtask); 
    SharedPreferences sp = this.getSharedPreferences("itemsList", 0); 
    SharedPreferences.Editor e = sp.edit(); 
    e.putString(newtask,s); 
    e.apply(); 

    counter++; 
} 

}

+0

あなたはどこで共有の設定から価値を得ましたか? –

+0

あなたのデータを追加し終えたら 'e.commit()'を使ってみてください。 –

+0

私はそれを試しました。うまくいきませんでした。 – SamaSamrin

答えて

0

2つのこと:

1)SharedPreferences使用初期化するには:

sharedPreferences = getSharedPreferences("itemsList", Context.MODE_PRIVATE); 

2)どこにaddItem()メソッドを呼び出しています?

+0

xmlのADDボタンをクリックするとaddItemがメソッドとして呼び出されます。 – SamaSamrin

+0

と私はあなたの最初の提案を最初に使ったが、うまくいかなかった。 – SamaSamrin

1

あなたが保存したいキーの値の比較的小さなコレクションを持っている場合は、 あなたが共有好みからShared preference API

読むを使用する必要があります:あなたが欲しいのキーと値を渡し

書き込むには、SharedPreferencesでedit()を呼び出してSharedPreferences.Editorを作成します。

パスキー、あなたがこの方法putIntを(使用して保存したい値)putString()、その後、変更を保存する)(コミットを呼び出します。提供する共有設定ファイルから値を取得する

、例えばのgetInt(AS呼び出しメソッド)のgetString()、 :例:共有嗜好から

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); 
SharedPreferences.Editor editor = sharedPref.edit(); 
editor.putInt("KeyName", newHighScore); 
editor.commit(); 

書き込み必要な値のキー、およびオプションでキーが存在しない場合に返されるデフォルト値。例:

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); 
int defaultValue = getResources().getInteger(R.string.saved_high_score_default); 
long highScore = sharedPref.getInt("KeyName", defaultValue); 
+0

私はこの基本的な考え方を得て、このように実装しましたが、アプリケーションを終了して再起動すると値も消えてしまいます。 items.add(x)を追加した後。 onCreate()では、最初の入力をリストの3番目の位置( "First Item"と "Second Item"の後)に保存しますが、後のものは保存しません。また、3番目の位置にのみすべての入力を保存しています。 私はなぜそれが理解できません。 – SamaSamrin

+0

基本的には、以前の値を更新値で置き換えるので、以前の値が得られません。/ – QuokMoon

+0

oh。新しい入力を新しいリストア不可能なリスト項目として保存したい場合、どうすればよいですか? – SamaSamrin

0

問題はアイテムを保存するためのタグです。あなたはこの形式で項目を追加

dummyname = dummyname + num; 

:この行を参照してください

task0 
task1 
task2 

いますが、この形式で値を取得している

task0 
task01 
task012 

は、単にコードのこれらの2行を変更:

//dummyname = dummyname + num; 
//String x = sp.getString(dummyname, "not found"); 
String newDummy= dummyname + num; 
String x = sp.getString(newDummy, "not found");