Java setChecked()导致崩溃;复选框变量未初始化,是否始终为空?

Java setChecked()导致崩溃;复选框变量未初始化,是否始终为空?,java,android,checkbox,Java,Android,Checkbox,我有一个包含多个复选框的对话框。创建对话框时,应根据指定布尔变量的状态将框初始化为选中/未选中。变量检查通过得很好,但是当我使用CheckBox.setChecked(true/false)时,它会使应用程序崩溃 经过一番研究和尝试,我注意到我用来指向复选框的小部件变量没有被初始化,尽管我不知道为什么。我将它与相应的id连接起来,但它似乎没有粘住。即使是单步执行代码,在findViewbyId()调用之后,变量也会立即显示为null。我不知道为什么 (虽然有5个复选框,但我将仅显示其中一个复选框

我有一个包含多个复选框的对话框。创建对话框时,应根据指定布尔变量的状态将框初始化为选中/未选中。变量检查通过得很好,但是当我使用CheckBox.setChecked(true/false)时,它会使应用程序崩溃

经过一番研究和尝试,我注意到我用来指向复选框的小部件变量没有被初始化,尽管我不知道为什么。我将它与相应的id连接起来,但它似乎没有粘住。即使是单步执行代码,在findViewbyId()调用之后,变量也会立即显示为null。我不知道为什么

(虽然有5个复选框,但我将仅显示其中一个复选框的代码,因为它们在功能上完全相同)

MatrixActionActivity.java

public class MatrixActionActivity extends AppCompatActivity {
...
    private CheckBox mHotSimCheck, mPublicCheck, mNoiseCheck, mDiffGridCheck, mSilentCheck;
...
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_actions);

        mHotSimCheck = (CheckBox)findViewById(R.id.checkbox_hotsim); // <-- mHotSimCheck registers as null even after this statement

        //This button opens preferences dialog
        mPrefsButt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(MatrixActionActivity.this);
                LayoutInflater inflater = MatrixActionActivity.this.getLayoutInflater();
                final View dialogView = inflater.inflate(R.layout.dialog_matrix_action_modifiers, null);
                dialogBuilder.setView(dialogView);


                final MyDeck deck = MyDeck.getInstance();
                if(deck.isDiveDPActive) {
                    Toast.makeText(MatrixActionActivity.this, "deck.isDiveDPActive = true.", Toast.LENGTH_SHORT).show(); // <-- shows fine when next statement is removed
                    mHotSimCheck.setChecked(true); // <-- Causes crash
                }else{
                    mHotSimCheck.setChecked(false);
                }

                dialogBuilder.setTitle("Dice Pool Modifier Preferences");
                dialogBuilder.setPositiveButton("Done", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        //nada
                    }
                });
                dialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        //nada
                    }
                });
                AlertDialog b = dialogBuilder.create();
                b.show();
            }
        });
公共类MatrixActionActivity扩展了AppCompatActivity{
...
私有复选框mHotSimCheck、mppubliccheck、mNoiseCheck、mDiffGridCheck、mSilentCheck;
...
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_actions);

mHotSimCheck=(CheckBox)findViewById(R.id.CheckBox_hotsim);//它是
null
,因为
setContentView
中的
xml
活动动作而包含该复选框的xml是对话框矩阵动作修改器.xml,所以它显然会在
复选框
中变为null

在构建对话框之后

mHotSimCheck = (CheckBox) dialogView.findViewById(R.id.checkbox_hotsim);
不要忘记在setcontentview之后删除这一行

mHotSimCheck = (CheckBox)findViewById(R.id.checkbox_hotsim);
NB


您在哪里实例化了变量
mPrefsButt

该复选框不包含在活动的xml中,因此
findViewById()
返回空值。
创建
对话框视图
后,必须在
onClick()内初始化
复选框

mHotSimCheck = (CheckBox) dialogView.findViewById(R.id.checkbox_hotsim);

发布崩溃日志。检查我的答案请检查我的编辑并告诉我你是说“findByView”只检查setContentView中指定的xml中的ID?如何让它连接到对话框布局“对话框\矩阵\动作\修改器”中的ID?我刚刚尝试了“mHotSimCheck”mPrefsButt.onClick块内的局部变量以及所有其他对话框代码,但没有变化。是的findviewbyid在set-ctontent视图中检查xml,以实现您想要的内容检查我的编辑Bingo!当我尝试初始化内部对话框时,我忽略了从dialogView调用findviewbyid。我现在明白为什么这是必要的。Th非常感谢!嗯,这就是我刚才尝试的-没有更改。mHotSimCheck之后仍然显示为null。没有更改的意思?是
mHotSimCheck
仍然为null?还是其他什么?在我的回答中,我提到:您必须初始化onClick()中的复选框我忽略了从dialogView调用findViewById。它正在工作。谢谢!为什么?这是建议。当你说这就是我刚才尝试的内容时,你是什么意思?你不能在onClick之外使用dialogView。所以你没有尝试。
mHotSimCheck = (CheckBox) dialogView.findViewById(R.id.checkbox_hotsim);