代码之家  ›  专栏  ›  技术社区  ›  groo

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

  •  13
  • groo  · 技术社区  · 15 年前

    我有一个活动,在这个活动中,用户可以通过单击标签附近的按钮来更新特定的信息。这个按钮会触发一个对话框,其中有一些字段用于获取用户输入,还有一个按钮用于完成编辑。

    我的问题是,我无法获得对特定于对话框的XML布局中的按钮声明的引用。按钮引用返回空值。遵循一些代码片段进行ILUStrate。

    触发事件以生成对话框的按钮在活动中声明为实例变量,如下所示:

    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触发器所在的特定行是在尝试获取上面的按钮引用之后,i尝试设置onclickListener。

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

    bsalvarro为空。

    我尝试使用代码行在上面设置的对话框的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>
    

    正如您所看到的,该按钮是用id botaosalvarcarro声明的,但是尝试获取对它的引用时返回空值。我对此有点困惑,好像我拿出了设置听众的行,对话框被正确显示了,所以。如何正确获取此按钮的引用?

    2 回复  |  直到 9 年前
        1
  •  15
  •   Cristian    15 年前
    dialogCarro = new Dialog(this);
    dialogCarro.setContentView(R.layout.novo_carro_dialog);
    bSalvarCarro = (Button)dialogCarro.findViewById(R.id.botaoSalvarCarro);
    
        2
  •  -1
  •   Paul Roub jim    9 年前

    始终可以获取视图的字符串值的整数值 getTag() :

    Java:

    public void buttonOnClick(View view) {
        int tag = Integer.valueOf(String.valueOf(view.getTag()));
        switch ( tag ) {
            case 0: {
                // First Button
                break;
            }
        }
    }
    

    XML:

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="First Button"
        android:onClick="buttonOnClick"
        android:tag="0"/>