Ошибка восстановления SharedPreferences

#android #sharedpreferences

#Android #sharedpreferences

Вопрос:

Хорошо, после тщательного изучения этого.. у меня есть свой код для этого. Все ресурсы, которые я видел, показывают, что синтаксис моего кода правильный, однако у меня возникают проблемы с принудительным завершением работы с моим приложением .. Вот мой текущий код:

 package com.MonatecSolutions.SafeN_Secure;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

/**
 * Created by cchance on 6/24/2014.
 */
public class settingActivity extends Activity {
    TextView txt_nameval;
    EditText txt_delayval;
    Button btn_save;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_settings);

        // Grab the preferences
        final SharedPreferences preferences = getSharedPreferences("myPrefs", 0); // Made final for the onClickListener

        txt_nameval = (TextView) findViewById(R.id.txt_myName);
        txt_delayval = (EditText) findViewById(R.id.txt_delay);
        btn_save = (Button) findViewById(R.id.btnSave);

        // Setting the text from the preferences
        String myName = preferences.getString("myName", "");
        int myDelay = preferences.getInt("delay", 60);
        txt_nameval.setText(myName);
        txt_delayval.setText(myDelay);

        btn_save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // Saving the settings and returning to the main screen
                preferences.edit().putString("myName", txt_nameval.getText().toString()).commit();
                preferences.edit().putInt("delay", Integer.parseInt(txt_delayval.getText().toString())).commit();
                startActivity(new Intent(settingActivity.this, MyActivity.class));
            }
        });
    }
}
  

Из logcat я получаю это:

 06-24 15:12:50.679    1852-1852/com.MonatecSolutions.SafeN_Secure E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.MonatecSolutions.SafeN_Secure, PID: 1852
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.MonatecSolutions.SafeN_Secure/com.MonatecSolutions.SafeN_Secure.settingActivity}: java.lang.NullPointerException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2121)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
        at android.app.ActivityThread.access$800(ActivityThread.java:135)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5017)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.NullPointerException
        at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:173)
        at com.MonatecSolutions.SafeN_Secure.settingActivity.<init>(settingActivity.java:21)
        at java.lang.Class.newInstanceImpl(Native Method)
        at java.lang.Class.newInstance(Class.java:1208)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2112)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
            at android.app.ActivityThread.access$800(ActivityThread.java:135)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5017)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)
  

Я надеюсь, что кто-нибудь сможет пролить некоторый свет на это для меня. Я родом из C #, поэтому, возможно, я делаю что-то, что, как я знаю, я могу сделать на C #, но не понимаю, что это невозможно сделать на Java.

Комментарии:

1. Нет, @jungleboy Так у меня было раньше, но из-за возможного ответа Тайлера Олсона я переместил его во внешнюю область, чтобы ему не нужен был финал

2. Вы зарегистрировались Activity в manifest файле?

3. да, активность зарегистрирована. Эта проблема начала возникать только после включения SharedPrefferences

Ответ №1:

Переместите код SharedPreferences создания внутрь onCreate :

 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout_settings);

    preferences = getSharedPreferences("myPrefs", 0);

    //Other stuffs here
}
  

[Правка1]
Замените Integer на int в следующем операторе:

 Integer myDelay = preferences.getInt("delay", 60);
  

[Правка2]
Вы зарегистрировались Activity в manifest файле?

[Правка3]
Виновником является это утверждение:

  txt_delayval.setText(myDelay);
  

Замените его на:

 txt_delayval.setText(""   myDelay);
  

Комментарии:

1. да, активность зарегистрирована. Эта проблема начала возникать только после включения SharedPrefferences

2. вау … таким образом, переопределение public final void setText(int resid) абсолютно является поддельным. Вы получили это! Я просто не понимаю, как произошел сбой переопределения.. Окончательное исправление: Целое число должно содержать регистр (явно или неявно) в строке. Хорошая находка!

3. @ClintChance, resid который он показывает, является идентификатором ресурса (например TextView ). Вы не можете просто передать целочисленное значение, которое не сопоставляется с ресурсом.

4. Что объясняет, почему он искал ресурс. Спасибо!!

Ответ №2:

Поскольку вы находитесь в Activity, вам не нужно определять Preference Manager, поскольку он получает настройки из контекста. Я никогда не использовал ‘final’ при создании переменной SharedPreferences. Я бы также использовал строку и число для параметров, как показано ниже: РЕДАКТИРОВАТЬ: определить настройки перед вызовом функций

 public class settingActivity extends Activity {
TextView txt_nameval;
EditText txt_delayval;
Button btn_save;
public static final String PREFS_NAME = "MyPrefsFile";
protected SharedPreferences preferences;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout_settings);
    preferences = getDefaultSharedPreferences(PREFS_NAME, 0);
  

Здесь есть довольно хороший пример

Комментарии:

1. Итак, я изменил код, однако проблема с интерфейсом все еще возникает, однако logcat может сказать что-то новое.

2. Не могли бы вы сказать мне, в чем ошибка? И где это происходит?

3. Ошибка возникает, когда я вхожу в действие. Проблема задокументирована в logcat, однако я пока недостаточно опытен, чтобы полностью ее прочитать (я только что получил возможность читать стеки трассировки из C # :))

4. Попробуйте самые последние изменения.

Ответ №3:

// сохранить

void save() {

 SharedPreferences shfObject=getSharedPreferences("savefile",Context.MODE_PRIVATE);


     SharedPreferences.Editor  shfEditorObject=shfObject.edit();

     shfEditorObject.putInt("score", highscore);
  

}

// загрузить

пустая загрузка () {

         SharedPreferences shfObject=getSharedPreferences("savefile",Context.MODE_PRIVATE);

        highscore=shfObject.getInt("score", highscore);
  

}

Комментарии:

1. Я не уверен, как здесь поможет настройка объектов для событий загрузки и сохранения. Однако я попробую и дам вам знать.