Почему мне нужно создать новый объект SharedPreferences для каждого метода, в котором он используется (например, кнопки onClick для кнопок)? Почему я не могу просто создать его один раз в начале класса, а затем использовать его из любого метода для добавления и удаления из него, как во втором примере? Если я перемещаю 2 строки вне метода, как во втором примере, когда действие должно начинаться (когда я перехожу к нему из другого действия), он автоматически сбрасывается с сообщением "Приложение неожиданно остановилось - принудительно закрыть".
Пример 1 - это работает
public class FormEdit extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
...
Button btnSave = (Button) findViewById(R.id.btnSave);
btnSave.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
SharedPreferences myPref = getSharedPreferences("PrefData", MODE_PRIVATE );
SharedPreferences.Editor myPrefEditor = myPref.edit();
...
myPrefEditor.putString("Key", value);
myPrefEditor.commit();
...
Пример 2 - не работает
public class FormEdit extends Activity {
SharedPreferences myPref = getSharedPreferences("PrefData", MODE_PRIVATE );
SharedPreferences.Editor myPrefEditor = myPref.edit();
@Override
public void onCreate(Bundle savedInstanceState) {
...
Button btnSave = (Button) findViewById(R.id.btnSave);
btnSave.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
...
myPrefEditor.putString("Key", value);
myPrefEditor.commit();
= update = log cat:
E/AndroidRuntime(620):
Uncaught handler: thread main exiting due to uncaught exception
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.devtest/com.devtest.FormEdit}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2417)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
at android.app.ActivityThread.access$2200(ActivityThread.java:119)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4363)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:146)
at com.devcom.android.devtest.IceEdit.<init>(IceEdit.java:20)
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1479)
at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2409)
... 11 more
Метод getSharedPreferences() требует контекста вашей активности, созданного после вашего super.onCreate()
. Поэтому, если вы создаете экземпляр объекта SharedPreferences
перед вашим onCreate
, он onCreate
.
Сделайте это в onCreate
вашей деятельности и используйте ее впоследствии.
Вероятно, потому что, как только вы нажмете один раз, у вас есть редактор, который уже был зафиксирован. Вы можете пойти на полпути и сделать что-то вроде:
public class FormEdit extends Activity {
SharedPreferences myPref = getSharedPreferences("PrefData", MODE_PRIVATE );
@Override
public void onCreate(Bundle savedInstanceState) {
...
Button btnSave = (Button) findViewById(R.id.btnSave);
btnSave.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
SharedPreferences.Editor myPrefEditor = myPref.edit();
myPrefEditor.putString("Key", value);
myPrefEditor.commit();
Обновить:
Ах, я не думал об этом достаточно близко. Эта строка:
SharedPreferences myPref = getSharedPreferences("PrefData", MODE_PRIVATE );
У вас проблемы с запуском до создания вашей активности. Перемещение его на ваш onCreate должно помочь. Сделайте привычку размещать трассировку стека, когда у вас возник вопрос с сбоем, это поможет значительно сократить проблему.
public class FormEdit extends Activity {
SharedPreferences myPref;
@Override
public void onCreate(Bundle savedInstanceState) {
...
myPref = getSharedPreferences("PrefData", MODE_PRIVATE );
Button btnSave = (Button) findViewById(R.id.btnSave);
btnSave.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
SharedPreferences.Editor myPrefEditor = myPref.edit();
myPrefEditor.putString("Key", value);
myPrefEditor.commit();