Como obter referência a um botão criado em uma caixa de diálogo personalizada, usando um layout xml?
Eu tenho uma atividade na qual o usuário pode atualizar uma informação específica clicando em um botão próximo a um marcador. Esse botão aciona um diálogo onde eu tenho alguns campos para obter a entrada do usuário e um botão para concluir a edição.
Meu problema é que não consigo obter uma referência ao botão declarar no layout xml específico da caixa de diálogo. A referência do botão retorna nulo. Siga algum trecho de código para ilustrar.
O botão que aciona o evento para criar o diálogo é declarado como uma variável de instância na atividade da seguinte maneira:
private Button bConfigurarCarro;
que o método onCreate:
bConfigurarCarro = (Button)findViewById(R.id.bConfigurarCarro);
bConfigurarCarro.setOnClickListener(configuraCarroListener);
isso dispara corretamente o evento para criar a caixa de diálogo:
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.");
}
};
do que criar o diálogo Substitui o método onCreateDialog como este:
@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;
}
A linha específica em que o NullPointer dispara é aquela em que, depois de tentar obter a referência de botão acima, eu do que tentar definir o OnClickListener.
bSalvarCarro = (Button)findViewById(R.id.botaoSalvarCarro);
bSalvarCarro.setOnClickListener(salvarCarroListener);
o bSalvarCarro é nulo.
O layout xml para a caixa de diálogo que tento definir acima usando a linha de código:
dialogCarro.setContentView(R.layout.novo_carro_dialog);
É este (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>
Como você pode ver, o Button é declarado com o id botaoSalvarCarro, mas tentar obter uma referência a ele retorna nulo. Estou um pouco confuso com isso, como se eu pegasse a linha que define o ouvinte, a caixa de diálogo é exibida corretamente, então. Como obtenho a referência a este botão corretamente?