如何在使用XML布局创建自定义对话框时获取对话框中按钮的引用?

14

我有一个Activity,在其中用户可以通过点击标签旁边的按钮来更新特定信息。这些按钮会触发一个对话框(Dialog),其中我有一些字段来获取用户输入以及一个完成编辑的按钮。

我的问题是,我无法获取对话框(Dialog)中声明的按钮的引用。该按钮引用返回null。以下是一些代码片段以说明问题:

触发构建对话框的按钮在Activity中声明为实例变量,如下所示:

private Button bConfigurarCarro;

比onCreate方法更好:

bConfigurarCarro = (Button)findViewById(R.id.bConfigurarCarro);
 bConfigurarCarro.setOnClickListener(configuraCarroListener);

这样做可以正确地触发创建对话框的事件:

protected OnClickListener configuraCarroListener = new OnClickListener(){
public void onClick(View v) {
showDialog(CARRO_DIALOG_ID);
Log.d(TAG, "Executando evento do botão de configuração de carro no abastecimento.");
            }
        };

与其像这样创建对话框覆盖onCreateDialog方法,不如:

@Override
protected Dialog onCreateDialog(int id) {
  switch (id) {
    case TIME_DIALOG_ID:
        return new TimePickerDialog(this, mTimeSetListener, hora, minuto, false);
    case DATE_DIALOG_ID:
        return new DatePickerDialog(this, mDateSetListener, ano, mes, dia);
    case CARRO_DIALOG_ID:
        Log.d(TAG, "Criando dialog de cadastro de carro.");
        dialogCarro = new Dialog(this);
        dialogCarro.setContentView(R.layout.novo_carro_dialog);
        bSalvarCarro = (Button)findViewById(R.id.botaoSalvarCarro);
        bSalvarCarro.setOnClickListener(salvarCarroListener);
        dialogCarro.setTitle("Carro");
        dialogCarro.getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
        Log.d(TAG, "Dialog de cadastro de carro criado retornando...");
        return dialogCarro;
    }
        return null;
}

NullPointer 异常被触发的具体行是在我尝试获取 Button 引用之后,然后尝试设置 setOnClickListener 的那一行。

bSalvarCarro = (Button)findViewById(R.id.botaoSalvarCarro);
bSalvarCarro.setOnClickListener(salvarCarroListener);

bSalvarCarro为空。

我试图使用以下代码行设置Dialog的xml布局:

dialogCarro.setContentView(R.layout.novo_carro_dialog);
这个(novo_carro_dialog.xml)是不是这样的:
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent" android:layout_height="fill_parent">
            <TableRow>
                <TextView android:id="@+id/marcaCarro"
                    android:layout_width="wrap_content" android:layout_height="wrap_content" 
                    android:text="@string/marcaCarro"/>
                <EditText android:id="@+id/tMarcaCarro" android:singleLine="true" android:layout_width="fill_parent"
                android:layout_height="wrap_content" android:width="130px"/>
            </TableRow>
            <TableRow>
                <TextView android:id="@+id/nomeCarro"
                    android:layout_width="wrap_content" android:layout_height="wrap_content" 
                    android:text="@string/nomeCarro"/>
                <EditText android:id="@+id/tNomeCarro" android:singleLine="true" android:layout_width="fill_parent"
                android:layout_height="wrap_content"/>
            </TableRow>
            <TableRow>
                <TextView android:id="@+id/anoCarro"
                    android:layout_width="wrap_content" android:layout_height="wrap_content" 
                    android:text="@string/anoCarro"/>
                <EditText android:id="@+id/tAnoCarro" android:singleLine="true" android:layout_width="fill_parent"
                android:numeric="integer" android:maxLength="4" android:layout_height="wrap_content" />
            </TableRow>
            <TableRow>
                <TextView android:id="@+id/modeloCarro"
                    android:layout_width="wrap_content" android:layout_height="wrap_content" 
                    android:text="@string/modeloCarro"/>
                <EditText android:id="@+id/tModeloCarro" android:singleLine="true" android:layout_width="fill_parent"
                android:layout_height="wrap_content" />
            </TableRow>
            <Button android:id="@+id/botaoSalvarCarro" android:layout_width="wrap_content"
                    android:layout_height="wrap_content" android:text="@string/bSalvarCarro" />
</TableLayout>

你可以看到,Button 被声明为 botaoSalvarCarro 的 id,但是试图获取它的引用返回 null。我有些困惑,因为如果我去掉设置监听器的那行代码,对话框就会正确显示。那么我该如何正确地获取这个按钮的引用呢?

1个回答

15
dialogCarro = new Dialog(this);
dialogCarro.setContentView(R.layout.novo_carro_dialog);
bSalvarCarro = (Button)dialogCarro.findViewById(R.id.botaoSalvarCarro);

谢谢。它起作用了。我简直不敢相信我错过了那个,正如你所想象的,我是新手安卓开发者。在5分钟内,我将能够标记这个作为正确答案。 - groo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接