保存复选框值

时间:2011-10-29 21:18:25

标签: android checkbox sharedpreferences

您好我想保存一些.xml表单中的复选框的值。 我在我的主xml上使用SharedPreferences,但我无法编译,因为我收到消息:

Cannot invoke isChecked() on the primitive type int
是的,有人能帮帮我吗? 代码应该如何?

编辑代码:

@Override 
public void onPause() { 
    super.onPause(); 
    final CheckBox checkBox = (CheckBox) findViewById(R.id.nieuwbel); 
    save(checkBox.isChecked()); 
}  

private CheckBox checkBox = null;

@Override  
public void onResume() { 
    super.onResume();  
    checkBox = (CheckBox) findViewById(R.id.nieuwbel); 
    checkBox.setChecked(load()); <----- still exception line 464 
}   
private void save(final boolean isChecked) { 
    SharedPreferences sharedPreferences = getPreferences(Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = sharedPreferences.edit(); 
    editor.putBoolean("check", isChecked); 
    editor.commit(); 
} 

private boolean load() {  
    SharedPreferences sharedPreferences = getPreferences(Context.MODE_PRIVATE); 
    return sharedPreferences.getBoolean("check", false); 
} 

异常代码Logcat:

10-29 23:35:31.556: E/AndroidRuntime(3292): FATAL EXCEPTION: main
10-29 23:35:31.556: E/AndroidRuntime(3292): java.lang.RuntimeException: Unable to resume activity {com.sencide/com.sencide.AndroidLogin}: java.lang.NullPointerException
10-29 23:35:31.556: E/AndroidRuntime(3292):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2241)
10-29 23:35:31.556: E/AndroidRuntime(3292):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2256)
10-29 23:35:31.556: E/AndroidRuntime(3292):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1789)
10-29 23:35:31.556: E/AndroidRuntime(3292):     at android.app.ActivityThread.access$1500(ActivityThread.java:123)
10-29 23:35:31.556: E/AndroidRuntime(3292):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
10-29 23:35:31.556: E/AndroidRuntime(3292):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-29 23:35:31.556: E/AndroidRuntime(3292):     at android.os.Looper.loop(Looper.java:130)
10-29 23:35:31.556: E/AndroidRuntime(3292):     at android.app.ActivityThread.main(ActivityThread.java:3835)
10-29 23:35:31.556: E/AndroidRuntime(3292):     at java.lang.reflect.Method.invokeNative(Native Method)
10-29 23:35:31.556: E/AndroidRuntime(3292):     at java.lang.reflect.Method.invoke(Method.java:507)
10-29 23:35:31.556: E/AndroidRuntime(3292):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
10-29 23:35:31.556: E/AndroidRuntime(3292):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
10-29 23:35:31.556: E/AndroidRuntime(3292):     at dalvik.system.NativeStart.main(Native Method)
10-29 23:35:31.556: E/AndroidRuntime(3292): Caused by: java.lang.NullPointerException
10-29 23:35:31.556: E/AndroidRuntime(3292):     at com.sencide.AndroidLogin.onResume(AndroidLogin.java:463)
10-29 23:35:31.556: E/AndroidRuntime(3292):     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150)
10-29 23:35:31.556: E/AndroidRuntime(3292):     at android.app.Activity.performResume(Activity.java:3832)
10-29 23:35:31.556: E/AndroidRuntime(3292):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2231)
10-29 23:35:31.556: E/AndroidRuntime(3292):     ... 12 more

编辑2:几乎与其他用户一起解决了这个问题,但是当我启动应用程序并关闭它而不做任何事情(显示菜单等)时,我会在onPause的这一行得到一个nullexception:

putBoolean(PREF_BOOL, nieuwbel.isChecked()); 

到目前为止的代码:

public static final String PREFS_NAME = "SharedPrefsDemoPreferences";  
public static final String PREF_BOOL = "PrefBool"; 

private SharedPreferences mPrefs; 
private CheckBox nieuwbel;

public boolean myBoxState = false;
..
mPrefs = getSharedPreferences(PREFS_NAME, 0); 
  nieuwbel = (CheckBox)findViewById(R.id.nieuwbel);

通过菜单调用布局xml:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle item selection 
    switch (item.getItemId()) { 
    case R.id.menu_beltegoed: // Laat Beltegoed.xml zien en checkboxen worden geinitialiseerd
        MyBeltegoed dialog = new MyBeltegoed (this, new OnReadyListenerBeltegoed()); 
        dialog.setTitle("Optie beltegoed/toon:"); 
        dialog.show(); 
        nieuwbel = (CheckBox)dialog.findViewById(R.id.nieuwbel); 
        nieuwbel.setChecked(myBoxState); 
        nieuwbel.setOnCheckedChangeListener(new OnCheckedChangeListener(){ 

            @Override 
            public void onCheckedChanged(CompoundButton buttonView, 
                    boolean isChecked) { 
                myBoxState = nieuwbel.isChecked(); 

            }});
        return true; 
    case R.id.menu_sluit: 
        //showHelp(); 
        return true; 
    default: 
        return super.onOptionsItemSelected(item); 
    } 
}

onResume和onSave:

@Override 
protected void onResume() { 
    mPrefs = getSharedPreferences(PREFS_NAME, 0); 
    if(mPrefs!=null) 
        myBoxState=mPrefs.getBoolean(PREF_BOOL, false); 
    super.onResume(); 
}


@Override     
protected void onPause() { 
    Editor e = mPrefs.edit(); 
    e.putBoolean(PREF_BOOL, nieuwbel.isChecked()); //<-- NullPointer when i start and close the app, without doing some handlings.            
    e.commit();          
    Toast.makeText(this, "Settings Saved.", Toast.LENGTH_SHORT).show();         
    super.onPause();    
} 

编辑3:

@Override     
protected void onPause() { 
    MyBeltegoed dialog = new MyBeltegoed (this, new OnReadyListenerBeltegoed()); 
    nieuwbel = (CheckBox)dialog.findViewById(R.id.nieuwbel); 
    Editor e = mPrefs.edit();   
    e.putBoolean(PREF_BOOL, nieuwbel.isChecked()); <-- nullpointer              
    e.commit();          
    Toast.makeText(this, "Settings Saved.", Toast.LENGTH_SHORT).show();         
    super.onPause();    
}

2 个答案:

答案 0 :(得分:2)

您无法使用R.id.nieuwbel.isChecked()访问复选框的值。方法如下:

final CheckBox checkBox = (CheckBox) findViewById(R.id.nieuwbel);
         if (checkBox.isChecked()) {
             checkBox.setChecked(false);
         }

请参阅this链接。

所以onPause看起来像这样:

@Override 
public void onPause() { 
    super.onPause(); 
    final CheckBox checkBox = (CheckBox) findViewById(R.id.nieuwbel);
    save(checkBox.isChecked());
}

和onResume看起来像这样:

@Override 
public void onResume() { 
    super.onResume(); 
    final CheckBox checkBox = (CheckBox) findViewById(R.id.nieuwbel);
    checkBox.setChecked(load());
} 

答案 1 :(得分:1)

R.id. *只是您的观点的ID。

要获得真实视图,请致电:

findViewById(R.id.nieubwel);

在你的活动中(onPause和onResume很好)。

findViewById返回一般视图,因此您必须将其强制转换为复选框:

(CheckBox)findViewById(R.id.nieubwel);