Bro*_*roo 12 android nullpointerexception sharedpreferences
我第一次使用sharedPreferences,我似乎无法通过此错误.我有一个子菜单,应该允许用户设置他们的区域.这应该打开正确的区域活动,并在再次打开应用程序时进行存储和调用.我已经多次转圈,所以有些代码会有点奇怪.我一直专注于从美国(默认)改为英国.
在DDMS中,我得到了这个:
05-13 11:22:39.344: ERROR/AndroidRuntime(960): java.lang.NullPointerException
05-13 11:22:39.344: ERROR/AndroidRuntime(960): at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:146)
05-13 11:22:39.344: ERROR/AndroidRuntime(960): at com.silifeform.android.Prefs.editRegion(Prefs.java:29)
05-13 11:22:39.344: ERROR/AndroidRuntime(960): at com.silifeform.android.dog.onOptionsItemSelected(dog.java:344)
Run Code Online (Sandbox Code Playgroud)
我的代码是这样的:
public class Prefs extends Activity {
public static final String PREFS_NAME="LocalePrefs";
private String region;
public boolean isUk;
public boolean isUs;
public boolean isEu;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
//restore prefs
SharedPreferences settings= getSharedPreferences(PREFS_NAME,0);
String myRegion = settings.getString(region,"us");
this.region=myRegion;
changeLocale(getRegion());
}
public void editRegion(String sregion) {
// The error occurs here:
SharedPreferences settings = getSharedPreferences(PREFS_NAME,0);
SharedPreferences.Editor ed = settings.edit();
ed.clear();
ed.putString(region,sregion);
ed.commit();
}
public String getRegion(){
SharedPreferences settings= getSharedPreferences(PREFS_NAME,0);
String myRegion = settings.getString(region,"us");
String gRegion=myRegion;
return gRegion;
}
public void changeLocale(String locale){
try{
String l= locale;
if(l==("us")){
this.isUs=true;
Toast.makeText(this, "Us region P selected", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Prefs.this, dog.class);
startActivity(intent);
}
if(l.equals("uk")){
this.isUk=true;
//Toast.makeText(this, "UK region selected", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Prefs.this, cat.class);
startActivity(intent);
}
}catch (NullPointerException e){
//what to do here?
finish();
}
}
@Override
protected void onStop() {
super.onStop();
SharedPreferences settings = getPreferences(0);
SharedPreferences.Editor ed = settings.edit();
ed.putString(region,region);
ed.commit();
}
Run Code Online (Sandbox Code Playgroud)
我在dog类中的子菜单代码如下所示:
public boolean onOptionsItemSelected(MenuItem item){
Prefs pob = new Prefs();
switch (item.getItemId()){
//-------Options menu----------
case R.id.about:
//Toast.makeText(this, "About menu", Toast.LENGTH_SHORT).show();
//showAbout();
return true;
case R.id.locale:
//Toast.makeText(this, "Locale menu", Toast.LENGTH_SHORT).show();
return true;
//-----Sub menu----------
case R.id.uk_item:
Toast.makeText(this, "UK selected", Toast.LENGTH_SHORT).show();
pob.editRegion("uk");
pob.changeLocale("uk");
finish();
return true;
case R.id.us_item:
Toast.makeText(this, "US already selected", Toast.LENGTH_SHORT).show();
pob.changeLocale("us");
//finish();
return true;
default :
return super.onOptionsItemSelected(item);
}
Run Code Online (Sandbox Code Playgroud)
谢谢
Ste*_*han 39
getSharedPreferences()
只能在调用之后onCreate()
调用Activity
.你的Prefs
班级用得很奇怪onOptionsItemSelected()
.通常,您不会自己实例化活动.如果您的Prefs
类不是实际的Activity而是用于访问首选项的帮助程序类,Context
请将对象传递给您的方法,如下所示:
public void editRegion(Context ctx, String sregion) {
SharedPreferences settings = ctx.getSharedPreferences(PREFS_NAME,0);
SharedPreferences.Editor ed = settings.edit();
ed.clear();
ed.putString(region,sregion);
ed.commit();
}
Run Code Online (Sandbox Code Playgroud)
并通过以下方式调用:
pob.editRegion(this, "uk");
Run Code Online (Sandbox Code Playgroud)
从你的onOptionsItemSelected()
方法.
我有同样的事情,直到我进入斯蒂芬的答案,我才能得到我的问题的准确答案.但是我想让下一个更清楚:
我试图通过使用没有扩展Activity
Class 的外部类来访问活动之外的共享首选项.这让我一样 java.lang.NullPointerException
.
我的主要活动是创建一个需要Context
访问共享首选项的对象:
...
...
MyClass myClass = new MyClass (this);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的那样,MyClass创建是在调用onCreate之前完成的,这导致上下文被"半熟"并抛出java.lang.NullPointerException
.
为什么"半烤"?在调试问题时,我有一个断点
mSharedPreferences =
context.getSharedPreferences(PREF_FILE, context.MODE_PRIVATE);
Run Code Online (Sandbox Code Playgroud)
并且在检查上下文参数时,我能够看到它的值(其中一些反正)给出了错误的信念,即参数已完全初始化.
将myClass的初始化移动到onCreate事件中解决了以下问题:
...
...
MyClass myClass;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myClass = new MyClass (this);
}
Run Code Online (Sandbox Code Playgroud)