2016-06-01 17 views
0

私のアプリのメニューには2つのアイテムがあり、そのうちの1つはチェック可能で、私はSharedPreferencesを使って彼の状態を保存したい。ここ は私のコードです:: MainActivity
保存方法メニュー項目SharedPreferencesで状態を確認しましたか?

MenuItem bubu1; 
boolean isChecked; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_activity); 

bubu1.setChecked(getFromSP("cec1")); 
    } 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.action_rate_us: 

      break; 
     case R.id.action_enab: 
      saveInSp("cec1",isChecked); 
      if (bubu1.isChecked()) { 
       bubu1.setChecked(false); 

      }else{ 

       bubu1.setChecked(true); 
      } 
      return true; 
     default: 
      break; 
    } 

    return super.onOptionsItemSelected(item); 
} 

private boolean getFromSP(String key){ 
    SharedPreferences preferences = getApplicationContext().getSharedPreferences("PROJECT_NAME", android.content.Context.MODE_PRIVATE); 
    return preferences.getBoolean(key, false); 
} 

private void saveInSp(String key,boolean value){ 
    SharedPreferences preferences = getApplicationContext().getSharedPreferences("PROJECT_NAME", android.content.Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = preferences.edit(); 
    editor.putBoolean(key, value); 
    editor.commit(); 
} 


メニューXML

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto"> 
<item android:id="@+id/action_enab" 
    android:title="@string/enab" 
    android:orderInCategory="100" 
    android:showAsAction="always" 
    android:checkable="true" 
    android:checked="false" 
    /> 

<item 
    android:id="@+id/action_rate_us" 
    android:orderInCategory="100" 
    android:showAsAction="never" 
    android:title="@string/action_rate_us"/> 


そして、ここでは私が取得エラーですエラーから

FATAL EXCEPTION: main 
Process: dia.it.solutions.lagcleaner, PID: 6143 
java.lang.RuntimeException: Unable to start activity ComponentInfo{dia.it.solutions.lagcleaner/dia.it.solutions.lagcleaner.MainActivity}: java.lang.NullPointerException 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2447) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2507) 
at android.app.ActivityThread.access$900(ActivityThread.java:172) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:146) 
at android.app.ActivityThread.main(ActivityThread.java:5692) 
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:1291) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
at dia.it.solutions.lagcleaner.MainActivity.onCreate(MainActivity.java:95) 
at android.app.Activity.performCreate(Activity.java:5541) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2411) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2507)  
    at android.app.ActivityThread.access$900(ActivityThread.java:172)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:146)  
    at android.app.ActivityThread.main(ActivityThread.java:5692)  
    at java.lang.reflect.Method.invokeNative(Native Method)  

は、私があるため、ここでMainActivityからライン95のアプリがクラッシュが95行であることを理解する:

bubu1.setChecked(getFromSP( "cec1") );


これは何が起こっているのですか?

+0

'bubu1'オブジェクトを初期化する必要があります。 –

答えて

0

bubu1nullonCreateです。初期化されていないため、方法はありません。 コードを

に変更する
MenuItem bubu1; 
     boolean isChecked; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main_activity); 


     } 

     @Override 
     public boolean onCreateOptionsMenu(Menu menu) { 
      getMenuInflater().inflate(R.menu.main, menu); 
      bubu1 = menu.findItem(R.id.action_enab); 
      bubu1.setChecked(getFromSP("cec1")); 
      return true; 
     } 
@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.action_rate_us: 

       break; 
      case R.id.action_enab: 

       if (bubu1.isChecked()) { 
        bubu1.setChecked(false); 
        saveInSp("cec1",false); 
       }else{ 

        bubu1.setChecked(true); 
         saveInSp("cec1",true); 
       } 
       return true; 
      default: 
       break; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
+0

これでエラーは表示されませんが、アプリを再起動するとチェックボックスはオフになります。 –

+0

あなたの設定が保存されていないか正しく読み込まれていません –

+0

正しいキー値でsaveInSpメソッドを呼び出していることを確認してください –

0

bubu1nullの場合、使用する前にビューを初期化する必要があります。

関連する問題