2011-05-13 96 views
11

我第一次使用sharedPreferences,我似乎無法通過這個錯誤。我有一個應該允許用戶設置其區域的子菜單。這應該會打開正確的區域活動,並在應用程序再次打開時進行存儲和調用。 我一直在圍繞圈子多次,所以一些代碼會有點奇怪。我一直專注於從美國(默認)更改爲英國。SharedPreferences中的NullPointerException Android

在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) 

我的代碼是這樣的:

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(); 

} 

在狗類我的子菜單中的代碼如下所示:

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); 

     } 

謝謝

+0

代碼中的哪行會產生錯誤? – Egor 2011-05-13 11:46:35

回答

35

getSharedPreferences()只能在調用onCreate()後調用Activity。 課程在onOptionsItemSelected()中奇怪地使用。一般來說,你不要自己實例化活動。如果您Prefs類不是一個實際的活動,而是用於訪問偏好的輔助類,傳遞一個Context對象的方法,如:

,並通過調用它:從你的onOptionsItemSelected()

pob.editRegion(this, "uk"); 

方法。

+0

酷,這就是它,謝謝斯蒂芬。我仍然不太瞭解上下文,除了它發生的地方之外! – Broo 2011-05-13 12:12:22

+0

感謝百萬@Stephan。 – Prachi 2014-01-08 06:15:20

+0

感謝您的信息。您的句子'getSharedPreferences()只能在Activity上調用onCreate()之後調用。 '節省了我很多時間。 – 2015-08-26 18:17:56

7

我有同樣的事情,我無法得到我的問題的準確答案 直到我進入斯蒂芬的答案。不過,我希望下一個更清晰:

我試圖通過使用未擴展Activity類的外部類訪問活動外的共享首選項。這使我產生了相同的java.lang.NullPointerException

我的主要活動是創造其所需的Context訪問共享偏好的對象:

... 
    ... 
    MyClass myClass = new MyClass (this); 

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

正如你可以看到MyClass的創建完成之前被調用的onCreate,這導致上下文是「半烤「,並拋出java.lang.NullPointerException

爲什麼「半烤」?在調試的問題,我已經上線

mSharedPreferences = 
     context.getSharedPreferences(PREF_FILE, context.MODE_PRIVATE); 

一個斷點,並在檢查範圍內的參數,我能夠看到它的值(其中一些反正),給出錯誤觀念,認爲該參數是完全初始化。

移動myClass的初始化到onCreate事件解決了這個問題:

... 
    ... 
    MyClass myClass; 

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

     myClass = new MyClass (this); 
    } 
0

getSharedPrefrences()需要Context。像這樣使用:

SharedPreferences sp = mContext.getSharedPreferences("your_prefs", Activity.MODE_PRIVATE); 
相關問題