SharedPreferences 覆盖值
SharedPreferences overwrite value
我正在制作一个应用程序,其中我正在使用 Spinner
、EditText
和 Button
,当用户填写该文本并单击 Button
文本时显示在 Spinner
中,我的问题是我做了所有的事情,但是当我将数据添加到 Spinner
时,它会覆盖以前的数据并且以前的数据不会显示
public class MainActivity extends Activity {
Spinner spinner1;
Button add;
EditText subject;
ArrayAdapter btArrayAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinner1 = (Spinner) findViewById(R.id.spinner);
ArrayAdapter dataAdapter = new ArrayAdapter(MainActivity.this,android.R.layout.simple_spinner_item, list);
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner1.setAdapter(btArrayAdapter);
add = (Button) findViewById(R.id.button);
subject = (EditText) findViewById(R.id.editText);
spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapter, View v,
int position, long id) {
String item = adapter.getItemAtPosition(position).toString();
// Showing selected spinner item
Toast.makeText(getApplicationContext(),
"Selected Subject : " + item, Toast.LENGTH_LONG).show();
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
SharedPreferences sharedPref =getSharedPreferences("Info", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("Spinner_name",subject.getText().toString());
editor.commit();
}
public void btnClick(View view)
{
String content;
content = subject.getText().toString();
btArrayAdapter.add(content);
btArrayAdapter = new ArrayAdapter(MainActivity.this,android.R.layout.simple_spinner_item);
btArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
}
}
java.lang.RuntimeException: Unable to instantiate activity
ComponentInfo{com.example.helloworld/com.example.helloworld.MainActivity}:
java.lang.NullPointerException
at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1983)
at
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
at android.app.ActivityThread.access0(ActivityThread.java:130)
at
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at
android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:153)
at com.example.helloworld.MainActivity.(MainActivity.java:30)
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1319)
at android.app.Instrumentation.newActivity(Instrumentation.java:1053)
at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1974)
at
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
at android.app.ActivityThread.access0(ActivityThread.java:130)
at
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
editor.putString("Spinner_name",subject.getText().toString());
每次执行此操作时,旧字符串都会被覆盖。
首先,您应该将 ArrayAdapter 声明为 class 字段。然后在 onClick() 中,需要将每个 String 添加到 ArrayAdapter 中。最后在 onDestroy() 中,您可以将所有字符串保存到 SharedPreferences。
btArrayAdapter.add(content);
btArrayAdapter = new ArrayAdapter(MainActivity.this,android.R.layout.simple_spinner_item);
btArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
在这里您正确地添加了字符串,但是您立即丢弃了适配器并创建了一个新的。不要那样做。您应该只在 onCreate() 中初始化一次适配器。
editor.putString("Spinner_name",subject.getText().toString());
这只保存最近的字符串。它还会覆盖前一个。您需要从适配器中获取所有字符串,然后将它们保存为字符串集。
您可以通过保持单一 ArrayAdapter
并在单击按钮时更新它来实现该功能。也正如 Code-Apprentice 所说,您可以在首选项 onDestory
.
中以 Set<String>
的形式保存数据
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
public class MainActivity extends Activity {
/* Views */
Spinner spinner;
Button add;
EditText subject;
/* Adapter */
ArrayAdapter<String> dataAdapter;
ArrayList<String> list = new ArrayList<String>();
/* Preference */
SharedPreferences sharedPref;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/* initializing views */
spinner = (Spinner) findViewById(R.id.spinner);
add = (Button) findViewById(R.id.button);
subject = (EditText) findViewById(R.id.editText);
/* Get spinner data from preference */
sharedPref = getSharedPreferences("Info", Context.MODE_PRIVATE);
Set<String> savedStringSet = sharedPref.getStringSet("SpinnerData", null);
if (savedStringSet != null) {
list = new ArrayList<>(savedStringSet);
}
/* Setting up spinner */
dataAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_item,
list.toArray(new String[list.size()]));
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(dataAdapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapter, View v,
int position, long id) {
String item = adapter.getItemAtPosition(position).toString();
// Showing selected spinner item
Toast.makeText(getApplicationContext(),
"Selected Subject : " + item, Toast.LENGTH_LONG).show();
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
/* save list in shared preference */
SharedPreferences.Editor editor = sharedPref.edit();
editor.putStringSet("SpinnerData", new HashSet<String>(list));
editor.apply();
}
public void btnClick(View view) {
String content = subject.getText().toString(); // get user entered text.
/* update spinner */
list.add(content); // add to data list..
dataAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_item, list);
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
/* set updated spinner */
spinner.setAdapter(dataAdapter);
}
}
注意: 您可能需要在 btnClick
方法中进行一些验证,以编辑文本值,以防您不想在 ""
按钮点击。
我正在制作一个应用程序,其中我正在使用 Spinner
、EditText
和 Button
,当用户填写该文本并单击 Button
文本时显示在 Spinner
中,我的问题是我做了所有的事情,但是当我将数据添加到 Spinner
时,它会覆盖以前的数据并且以前的数据不会显示
public class MainActivity extends Activity {
Spinner spinner1;
Button add;
EditText subject;
ArrayAdapter btArrayAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinner1 = (Spinner) findViewById(R.id.spinner);
ArrayAdapter dataAdapter = new ArrayAdapter(MainActivity.this,android.R.layout.simple_spinner_item, list);
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner1.setAdapter(btArrayAdapter);
add = (Button) findViewById(R.id.button);
subject = (EditText) findViewById(R.id.editText);
spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapter, View v,
int position, long id) {
String item = adapter.getItemAtPosition(position).toString();
// Showing selected spinner item
Toast.makeText(getApplicationContext(),
"Selected Subject : " + item, Toast.LENGTH_LONG).show();
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
SharedPreferences sharedPref =getSharedPreferences("Info", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("Spinner_name",subject.getText().toString());
editor.commit();
}
public void btnClick(View view)
{
String content;
content = subject.getText().toString();
btArrayAdapter.add(content);
btArrayAdapter = new ArrayAdapter(MainActivity.this,android.R.layout.simple_spinner_item);
btArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
}
}
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.helloworld/com.example.helloworld.MainActivity}: java.lang.NullPointerException at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1983) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) at android.app.ActivityThread.access0(ActivityThread.java:130) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4745) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.NullPointerException at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:153) at com.example.helloworld.MainActivity.(MainActivity.java:30) at java.lang.Class.newInstanceImpl(Native Method) at java.lang.Class.newInstance(Class.java:1319) at android.app.Instrumentation.newActivity(Instrumentation.java:1053) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1974) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) at android.app.ActivityThread.access0(ActivityThread.java:130) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4745) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method)
editor.putString("Spinner_name",subject.getText().toString());
每次执行此操作时,旧字符串都会被覆盖。
首先,您应该将 ArrayAdapter 声明为 class 字段。然后在 onClick() 中,需要将每个 String 添加到 ArrayAdapter 中。最后在 onDestroy() 中,您可以将所有字符串保存到 SharedPreferences。
btArrayAdapter.add(content);
btArrayAdapter = new ArrayAdapter(MainActivity.this,android.R.layout.simple_spinner_item);
btArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
在这里您正确地添加了字符串,但是您立即丢弃了适配器并创建了一个新的。不要那样做。您应该只在 onCreate() 中初始化一次适配器。
editor.putString("Spinner_name",subject.getText().toString());
这只保存最近的字符串。它还会覆盖前一个。您需要从适配器中获取所有字符串,然后将它们保存为字符串集。
您可以通过保持单一 ArrayAdapter
并在单击按钮时更新它来实现该功能。也正如 Code-Apprentice 所说,您可以在首选项 onDestory
.
Set<String>
的形式保存数据
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
public class MainActivity extends Activity {
/* Views */
Spinner spinner;
Button add;
EditText subject;
/* Adapter */
ArrayAdapter<String> dataAdapter;
ArrayList<String> list = new ArrayList<String>();
/* Preference */
SharedPreferences sharedPref;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/* initializing views */
spinner = (Spinner) findViewById(R.id.spinner);
add = (Button) findViewById(R.id.button);
subject = (EditText) findViewById(R.id.editText);
/* Get spinner data from preference */
sharedPref = getSharedPreferences("Info", Context.MODE_PRIVATE);
Set<String> savedStringSet = sharedPref.getStringSet("SpinnerData", null);
if (savedStringSet != null) {
list = new ArrayList<>(savedStringSet);
}
/* Setting up spinner */
dataAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_item,
list.toArray(new String[list.size()]));
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(dataAdapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapter, View v,
int position, long id) {
String item = adapter.getItemAtPosition(position).toString();
// Showing selected spinner item
Toast.makeText(getApplicationContext(),
"Selected Subject : " + item, Toast.LENGTH_LONG).show();
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
/* save list in shared preference */
SharedPreferences.Editor editor = sharedPref.edit();
editor.putStringSet("SpinnerData", new HashSet<String>(list));
editor.apply();
}
public void btnClick(View view) {
String content = subject.getText().toString(); // get user entered text.
/* update spinner */
list.add(content); // add to data list..
dataAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_item, list);
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
/* set updated spinner */
spinner.setAdapter(dataAdapter);
}
}
注意: 您可能需要在 btnClick
方法中进行一些验证,以编辑文本值,以防您不想在 ""
按钮点击。