RadioGroup检索为空 [英] RadioGroup retrieve is null

查看:135
本文介绍了RadioGroup检索为空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试检索我的RADIOGROUP,以检查选中了哪个单选按钮。为此,我在onCreate()中使用以下代码:

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);
... }

但是我使用了调试功能,AndroidStudio告诉我radioGroup_LANGUE为空。所以我得到了NULLPOINTER EXCEPTION

在我的警报对话框中,当用户单击OK按钮时:

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();
                            }
                     }
                    });
                }});

我的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>

错误日志:

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();

方法:

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();
}


推荐答案

所有视图都在运行在 onCreate 中没有 setContentView 的情况下为null。

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);
 }

另一个为空的原因是如果您不使用XML文件在 setContentView 中包含 @ + id / RadioGroup_LANGUE (以及您要查找的其他ID)。

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.

编辑

您正在使用AlertDialog来显示视图,则需要在膨胀视图而不是Activity上使用 findViewById

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();

旁注:我不认为 setMessage setView 可以同时使用。

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

这篇关于RadioGroup检索为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆