Question

I have a checkbox in a login DialogFragment that I want to use to check to see if I should add the entered user name to the preferences. But when I do an if using the checkbox's isChecked() method I get a NullPointerException. I added a try/catch clock and then further tried to add a Log.d of the checkbox's toString output and again the NullPointerException shows up. So, while it's clear that the code does not seem to recognize the existence of the checkbox in the current scope, I can't figure out what I over looked. It allowed me to create a CheckBox using the findViewById without error. Thanks.

source code for login DialogFragment:

public class LoginDialogFragment extends DialogFragment {


public interface LoginDialogListener {
    public void onDialogPositiveClick(DialogFragment dialog);
    public void onDialogNegativeClick(DialogFragment dialog);
}

LoginDialogListener mListener;

public void onAttach(Activity activity) {
    super.onAttach(activity);
    // Verify that the host activity implements the callback interface
    try {
        // Instantiate the NoticeDialogListener so we can send events to the host
        mListener = (LoginDialogListener) activity;
    } catch (ClassCastException e) {
        // The activity doesn't implement the interface, throw exception
        throw new ClassCastException(activity.toString()
                + " must implement NoticeDialogListener");
    }
}
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    // Get the layout inflater
    LayoutInflater inflater = getActivity().getLayoutInflater();

    // Inflate and set the layout for the dialog
    // Pass null as the parent view because its going in the dialog layout
    builder.setView(inflater.inflate(R.layout.login_dialog, null))
    // Add action buttons
           .setPositiveButton("Login", new DialogInterface.OnClickListener() {
               @Override
               public void onClick(DialogInterface dialog, int id) {
                // Send the positive button event back to the host activity
                   CheckBox loginCheckBox = 
(CheckBox)getActivity().findViewById(R.id.input_chkbox);
                   try{
                       if(loginCheckBox.isChecked() == true){

mListener.onDialogPositiveClick(LoginDialogFragment.this);
                       }else{

mListener.onDialogNegativeClick(LoginDialogFragment.this);
                       }
                   }catch(Exception e){
                       Log.d(null, e.toString());
                       Log.d(null, loginCheckBox.toString());  // got 
nullPointerException again when I added this line in catch block.
                       Toast eToast = Toast.makeText(getActivity(), "error in: 
LoginDialogFragment.setPosButton.onClick", Toast.LENGTH_LONG);
                       eToast.show();
                   }
               }
           })    

source code for parent activity of the dialog fragment:

public class UsingPreferencesActivity
extends FragmentActivity
    implements LoginDialogFragment.LoginDialogListener{

protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.main);
    this.showLoginDialog();

}

public void showLoginDialog() {
    // Create an instance of the dialog fragment and show it
    DialogFragment dialog = new LoginDialogFragment();
    dialog.show(getSupportFragmentManager(), "LoginDialogFragment");
}

public void onDialogPositiveClick(DialogFragment dialog) {
    Toast toast = Toast.makeText(getBaseContext(), "OK", Toast.LENGTH_LONG);
    toast.show();

}

public void onDialogNegativeClick(DialogFragment dialog) {
    Toast toast = Toast.makeText(getBaseContext(), "Cancel", 
Toast.LENGTH_LONG);
    toast.show();
}

public void onClickLoad(View view){
    Intent i = new Intent("com.example.homework09.AppPreferenceActivity");
    startActivity(i);
}


public void onClickDisplay(View view){
    SharedPreferences appPrefs = 
getSharedPreferences("com.example.homework09_preferences",MODE_PRIVATE);
    DisplayText(appPrefs.getString("editTextPref", ""));
}


public void onClickModify(View view){
    SharedPreferences appPrefs = 
getSharedPreferences("com.example.homework09_preferences", MODE_PRIVATE);
    SharedPreferences.Editor prefsEditor = appPrefs.edit();
    prefsEditor.putString("editTextPref", 
((EditText)findViewById(R.id.etNewUsername)).getText().toString());
    prefsEditor.commit();
    DisplayText(appPrefs.getString("editTextPref", ""));
}


public void onClickReset(View view){

    SharedPreferences appPrefs = 
getSharedPreferences("com.example.homework09_preferences", MODE_PRIVATE);
    SharedPreferences.Editor prefsEditor = appPrefs.edit();
    prefsEditor.putString("editTextPref", " ");
    prefsEditor.commit();
    DisplayText(appPrefs.getString("editTextPref", ""));
}


private void DisplayText(String str){
    Toast.makeText(getBaseContext(), str, Toast.LENGTH_LONG).show();
    TextView textView = (TextView)findViewById(R.id.tvUsername);
    textView.setText(str);
}

}

layout for DialogFragment (login_dialog.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >


<EditText 
    android:id="@+id/input"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="[Enter username here]"/>

<CheckBox 
    android:id="@+id/input_chkbox"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Save Username?"
    android:defaultValue="false"
    />

</LinearLayout>
Was it helpful?

Solution

replace

CheckBox loginCheckBox = (CheckBox)getActivity().findViewById(R.id.input_chkbox);

with

AlertDialog alertDialog = (AlertDialog)dialog;
CheckBox loginCheckBox = (CheckBox)alertDialog.findViewById(R.id.input_chkbox);

here checkbox is a part of your Dialog not Activity. so you have to use dialog reference to get the Checkbox

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top