#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. Я не уверен, как здесь поможет настройка объектов для событий загрузки и сохранения. Однако я попробую и дам вам знать.