-3

I have Three radio buttons inside radiogroup and want, when user check any radio button it must be remain checked until user check any other button (either user close the app or not) and for this purpose I has used sharedPreferences to store this selected checkbox value and retrieve when activity is loaded, but getting error when I loads the activity for selecting checkbox. Below is my code.

Activity.java:

public static SharedPreferences pref;
public static String lang;
public static String chk;
public static RadioButton gujarati;
public static RadioButton hindi;
public static RadioButton english;
public static EditText txtV;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.select_language);
//  
//  String chk = pref.getString("key_name", null);
//  if(chk=="Gujarati"){
//      gujarati.setChecked(true);
//  }
//  else if(chk=="Hindi"){
//      hindi.setChecked(true);
//  }
//  else{
    //  english.setChecked(true);
    //}
    //editor.remove("key_name3"); // will delete key key_name3
    //editor.remove("key_name4"); // will delete key key_name4

    // Save the changes in SharedPreferences
    //editor.commit(); // commit changes
    //editor.clear();
     //editor.commit(); 

    RadioGroup group = (RadioGroup) findViewById(R.id.radioGroup1);
    gujarati = (RadioButton) findViewById(R.id.radio0);
    hindi = (RadioButton) findViewById(R.id.radio1);
    english = (RadioButton) findViewById(R.id.radio2);
    txtV = (EditText) findViewById(R.id.editText1);

    //int radio_selected = getSharedPreferences("your_prefs", Activity.MODE_PRIVATE).getInt("my_selected_radio",0);
    //int radio_selected = getSharedPreferences("your_prefs", Activity.MODE_PRIVATE).edit().putInt("my_selected_radio",selectedValue).commit();
    chk = pref.getString("key_name", null);

    if(chk == "Gujarati"){
        gujarati.setChecked(true);
    }
    if(chk == "Hindi"){
        hindi.setChecked(true);
    }
    if(chk == "English"){
        english.setChecked(true);
    }

    group.setOnCheckedChangeListener(new OnCheckedChangeListener(){

        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            // TODO Auto-generated method stub
            if(checkedId == R.id.radio0) {
                lang = "Gujarati";
                pref = getApplicationContext().getSharedPreferences("MyPref", 0); 
                Editor editor = pref.edit();
                editor.putString("key_name", lang);
                editor.commit();
                chk = pref.getString("key_name", null);
                txtV.setText(chk);

            } else if(checkedId == R.id.radio1) {
                lang = "Hindi";
                pref = getApplicationContext().getSharedPreferences("MyPref", 0); 
                Editor editor = pref.edit();
                editor.putString("key_name", lang);
                editor.commit();
                chk = pref.getString("key_name", null);
                txtV.setText(chk);
            } else {
                lang = "English";
                pref = getApplicationContext().getSharedPreferences("MyPref", 0); 
                Editor editor = pref.edit();
                editor.putString("key_name", lang);
                editor.commit();
                chk = pref.getString("key_name", null);
                txtV.setText(chk);

            }

        }

    });

activity.xml:

<RadioGroup
    android:id="@+id/radioGroup1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/textView1"
    android:layout_marginTop="25dp" >

    <RadioButton
        android:id="@+id/radio0"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="RadioButton" />

    <RadioButton
        android:id="@+id/radio1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="RadioButton" />

    <RadioButton
        android:id="@+id/radio2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="RadioButton" />
</RadioGroup>


<EditText
    android:id="@+id/editText1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/radioGroup1"
    android:layout_below="@+id/radioGroup1"
    android:layout_marginLeft="15dp"
    android:ems="10" >

    <requestFocus />
</EditText>

Logcat:

01-05 04:21:35.055: E/AndroidRuntime(2665): FATAL EXCEPTION: main
01-05 04:21:35.055: E/AndroidRuntime(2665): Process: com.finaldbparse.finaldbparse, PID: 2665
01-05 04:21:35.055: E/AndroidRuntime(2665): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.finaldbparse.finaldbparse/com.finaldbparse.finaldbparse.SelectLanguage}: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.String android.content.SharedPreferences.getString(java.lang.String, java.lang.String)' on a null object reference
01-05 04:21:35.055: E/AndroidRuntime(2665):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
01-05 04:21:35.055: E/AndroidRuntime(2665):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
01-05 04:21:35.055: E/AndroidRuntime(2665):     at android.app.ActivityThread.access$800(ActivityThread.java:144)
01-05 04:21:35.055: E/AndroidRuntime(2665):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
01-05 04:21:35.055: E/AndroidRuntime(2665):     at android.os.Handler.dispatchMessage(Handler.java:102)
01-05 04:21:35.055: E/AndroidRuntime(2665):     at android.os.Looper.loop(Looper.java:135)
01-05 04:21:35.055: E/AndroidRuntime(2665):     at android.app.ActivityThread.main(ActivityThread.java:5221)
01-05 04:21:35.055: E/AndroidRuntime(2665):     at java.lang.reflect.Method.invoke(Native Method)
01-05 04:21:35.055: E/AndroidRuntime(2665):     at java.lang.reflect.Method.invoke(Method.java:372)
01-05 04:21:35.055: E/AndroidRuntime(2665):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
01-05 04:21:35.055: E/AndroidRuntime(2665):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
01-05 04:21:35.055: E/AndroidRuntime(2665): Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.String android.content.SharedPreferences.getString(java.lang.String, java.lang.String)' on a null object reference
01-05 04:21:35.055: E/AndroidRuntime(2665):     at com.finaldbparse.finaldbparse.SelectLanguage.onCreate(SelectLanguage.java:55)
01-05 04:21:35.055: E/AndroidRuntime(2665):     at android.app.Activity.performCreate(Activity.java:5933)
01-05 04:21:35.055: E/AndroidRuntime(2665):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
01-05 04:21:35.055: E/AndroidRuntime(2665):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
01-05 04:21:35.055: E/AndroidRuntime(2665):     ... 10 more
Cœur
  • 37,241
  • 25
  • 195
  • 267

3 Answers3

3

Here:

chk = pref.getString("key_name", null);

1. You are not initializing pref instance of SharedPreferences but calling getString method. do it as:

pref = getApplicationContext().getSharedPreferences("MyPref", 0); 
chk = pref.getString("key_name", null);

2. Use String.equals for comparing Strings instead of ==

3. Initializing pref in onCreate method then no need to initialize again as currently you are doing in setOnCheckedChangeListener

ρяσѕρєя K
  • 132,198
  • 53
  • 198
  • 213
1

You got NPE because pref=NULL at

chk = pref.getString("key_name", null);

initialize pref before the used. do like

pref = getApplicationContext().getSharedPreferences("MyPref", 0); in onCreate(....)
M D
  • 47,665
  • 9
  • 93
  • 114
1

As you have implemented an onCheckedChangeListener event which is always gets called automatically whenever your activity starts. So the problem occurs is though your sharedpreference value is correct you are getting but after that immediately your CheckedChangeListener is called so the value which you have from your preference gets reset and you are getting incorrect result.

That is why i have removed the old value whenever you are going to check another radio button.

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

    group.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            // TODO Auto-generated method stub
            pref = getApplicationContext().getSharedPreferences("MyPref", 0);
            Editor editor1 = pref.edit();
            editor1.remove("key_name");
            if (checkedId == R.id.radio0) {
                lang = "Gujarati";
                pref = getApplicationContext().getSharedPreferences("MyPref", 0);
                Editor editor = pref.edit();
                editor.putString("key_name", lang);
                editor.commit();
                // chk = pref.getString("key_name", null);
                txtV.setText(lang);

            } else if (checkedId == R.id.radio1) {
                lang = "Hindi";
                pref = getApplicationContext().getSharedPreferences("MyPref", 0);
                Editor editor = pref.edit();
                editor.putString("key_name", lang);
                editor.commit();
                // chk = pref.getString("key_name", null);
                txtV.setText(lang);
            } else if (checkedId == R.id.radio2) {
                lang = "English";
                pref = getApplicationContext().getSharedPreferences("MyPref", 0);
                Editor editor = pref.edit();
                editor.putString("key_name", lang);
                editor.commit();
                // chk = pref.getString("key_name", null);
                txtV.setText(lang);

            }
        }

    });

    pref = getApplicationContext().getSharedPreferences("MyPref", 0);
    chk = pref.getString("key_name", null);
    System.err.println("Get value is=====" + chk);
    if (chk != null) {
        if (chk.equals("Gujarati")) {
            gujarati.setChecked(true);
        }
        if (chk.equals("Hindi")) {
            hindi.setChecked(true);
        }
        if (chk.equals("English")) {
            english.setChecked(true);
        }
    }
}
GrIsHu
  • 29,068
  • 10
  • 64
  • 102
  • 1
    `if(chk == "Gujarati")` is not valid if we want to compare String variables value – ρяσѕρєя K Jan 05 '15 at 05:03
  • I had added your code but still application forgets all status about the checked radio button when I restarts it. – Ravi Bhalodiya Jan 05 '15 at 05:10
  • I think after storing your selected checkbox value into sharedpreference you do not need to get it again from it to set it into your `TextView` as you have the value for each selected button in your String in your `setOnCheckedChangeListener` method. You can directly utilize that string value only. – GrIsHu Jan 05 '15 at 05:18
  • I had tried your code but after restarting my app it again forgets about checked check box, please help me. – Ravi Bhalodiya Jan 05 '15 at 05:25
  • @RaviBhalodiya Now try out my code i have updated it.. Its working fine now. – GrIsHu Jan 05 '15 at 06:42