RadioGroup retrieve is null

。_饼干妹妹 提交于 2019-12-08 11:43:02

问题


I try to retrieve my RADIOGROUP for check which Radio Button is checked. For this, I use this code in onCreate() :

/**
 * @param savedInstanceState
 */
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    radioGroup_LANGUE = (RadioGroup) findViewById(R.id.RadioGroup_LANGUE);
    radioGroup_MODE = (RadioGroup) findViewById(R.id.RGroup_ModeConnexion);
... }

But I use the debug, and AndroidStudio tell me radioGroup_LANGUE is null. So I get NULLPOINTER EXCEPTION.

In my alertdialog, when user click on OK Button :

.setNegativeButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    // if this button is clicked, just close
                    // the dialog box and do nothing
                    radioGroup_LANGUE.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
                        public void onCheckedChanged(RadioGroup radioGroup_LANGUE, int checkedId) {
                            // This will get the radiobutton that has changed in its check state
                            RadioButton checkedRadioButton = (RadioButton)radioGroup_LANGUE.findViewById(checkedId);

                            // This puts the value (true/false) into the variable
                            boolean isChecked = checkedRadioButton.isChecked();

                            /// If the radiobutton that has changed in check state is now checked...
                            if (isChecked)
                            {
                                // Changes the textview's text to "Checked: example radiobutton text"
                                Toast.makeText(MainActivity.this,"Checked:" + checkedRadioButton.getText(),Toast.LENGTH_LONG).show();
                            }
                     }
                    });
                }});

My xml :

<RadioGroup
    android:layout_width="148dp"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:id="@+id/RadioGroup_LANGUE">

<RadioButton
        android:layout_width="137dp"
        android:layout_height="wrap_content"
        android:text="@string/Langue_1"
        android:id="@+id/BouttonRADIO_EN"
        android:layout_gravity="center_horizontal"
        android:textSize="20dp"
        android:textStyle="bold" />

<RadioButton
        android:layout_width="137dp"
        android:layout_height="wrap_content"
        android:text="@string/Langue_2"
        android:id="@+id/BouttonRADIO_FR"
        android:layout_gravity="center_horizontal"
        android:textSize="20dp"
        android:textStyle="bold" />

</RadioGroup>

Error log :

06-01 22:51:53.053 21336-21336/com.example.my020571.sterela2 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.my020571.sterela2, PID: 21336
java.lang.NullPointerException
   at com.example.my020571.sterela2.MainActivity$4.onClick(MainActivity.java:321)
   at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:170)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:146)
   at android.app.ActivityThread.main(ActivityThread.java:5598)
   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:1283)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
   at dalvik.system.NativeStart.main(Native Method)

LINE 321 :

int selectedID = rGroup_LANGUE.getCheckedRadioButtonId();

METHOD :

private void changerLangue() {

    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
            context);


    final View view = View.inflate(MainActivity.this, R.layout.changer_langue, null);


    alertDialogBuilder.setView(view);



    // Titre de la fenêtre
    alertDialogBuilder.setTitle("Langue");
    // set dialog message
    alertDialogBuilder
            .setMessage("Veuillez choisir votre langue :")
            .setCancelable(false)
            .setIcon(R.drawable.logo_langue)

            .setPositiveButton("ANNULER", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    // if this button is clicked, close
                    // current activity
                    dialog.cancel();
                }
            })
            .setNegativeButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    // if this button is clicked, just close
                    // the dialog box and do nothing
                    int selectedID = rGroup_LANGUE.getCheckedRadioButtonId();
                    RadioButton selectedRadioButton = (RadioButton)findViewById(selectedID);
                    Toast.makeText(getApplicationContext(),selectedRadioButton.getText().toString(),Toast.LENGTH_SHORT).show();
                }});


                            // create alert dialog
    AlertDialog alertDialog = alertDialogBuilder.create();

    // show it
    alertDialog.show();
}

回答1:


All of your Views are going to be null without a setContentView in the onCreate.

private void RadioGroup radioGroup_LANGUE;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.YourLayoutFile); // TODO: Replace with your file

    radioGroup_LANGUE = (RadioGroup) findViewById(R.id.RadioGroup_LANGUE);
 }

Another reason they would be null is if you don't use an XML file that contains the @+id/RadioGroup_LANGUE (and other ids you want to find) in the setContentView.


Edit

Since you are using a AlertDialog to show the view, you need to use findViewById on the inflated view instead of on the Activity.

AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this);

// Get the view for the dialog
final View view = View.inflate(MainActivity.this, R.layout.changer_langue, null);
// Find views within it
rGroup_LANGUE = (RadioGroup) view.findViewById(R.id.RadioGroup_LANGUE);

rGroup_LANGUE.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        RadioButton checkedRadioButton = (RadioButton) group.findViewById(checkedId);

        // TODO: Implement this
}});

// build the dialog
AlertDialog alertDialog = alertDialogBuilder
        .setView(view)      // load the view
        .setTitle("Langue")
        .setMessage("Veuillez choisir votre langue")
        ...
        .setNegativeButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {                
                // Need to use findViewById from the RadioGroup here
                int selectedID = rGroup_LANGUE.getCheckedRadioButtonId();
                String msg = null;
                if (selectedId != -1) {
                    RadioButton selectedRadioButton = (RadioButton)rGroup_LANGUE.findViewById(selectedID);                
                    msg = selectedRadioButton.getText().toString();
                } else {
                    msg = "Nothing selected";
                }
            Toast.makeText(getApplicationContext(),msg,Toast.LENGTH_SHORT).show();
        }})
        .create();

// show it
alertDialog.show();

Sidenote: I don't think setMessage and setView can be used at the same time.




回答2:


Try this code with custom dialog:

public void changerLangue(){
        final Dialog mDialog;
        mDialog = new Dialog(MainActivity.this);
        mDialog.setContentView(R.layout.changer_langue);
        Button ok = (Button)mDialog.findViewById(R.id.btn_ok);
        ok.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                RadioGroup yourRadioGroup=(RadioGroup)mDialog.findViewById(R.id.RadioGroup_LANGUE);
                int selectedID = yourRadioGroup.getCheckedRadioButtonId();
                selectedRadioButton = (RadioButton)mDialog.findViewById(selectedID);
                Toast.makeText(getApplicationContext(),selectedRadioButton.getText().toString(),Toast.LENGTH_SHORT).show();
        });

        Button dismiss = (Button)mDialog.findViewById(R.id.btn_dismiss);
        dismiss.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mDialog.dismiss();
            }
        });
        mDialog.show();
    }
}

In your changer_langue xml add two buttons btn_ok and btn_dismiss. It works like charm! Cheers



来源:https://stackoverflow.com/questions/37576932/radiogroup-retrieve-is-null

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!