Сохранить значение флажка - PullRequest
       7

Сохранить значение флажка

1 голос
/ 30 октября 2011

Привет, я хочу сохранить значения некоторых флажков в форме .xml.Я использую SharedPreferences для этого в своем основном xml, но не могу скомпилировать, когда получаю сообщение:

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: Почти решен вопрос вместе с другим пользователем, нокогда я запускаю приложение и закрываю его, ничего не делая (показать меню и т. д.), я получаю nullexception в этой строке в onPause:

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 ]

2 голосов
/ 30 октября 2011

Вы не можете получить доступ к значению флажка с помощью R.id.nieuwbel.isChecked (). Вот как:

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

См. эту ссылку.

Итак, 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 голос
/ 30 октября 2011

R.id. * Являются просто идентификаторами ваших взглядов.

Чтобы получить реальный вид, звоните:

findViewById(R.id.nieubwel);

В вашей деятельности (onPause и onResume в порядке).

findViewById возвращает общий вид, поэтому вы должны привести его к флажку:

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