具有多个 EditText 的自定义警报对话框

Custom Alert Dialog with multiple EditText

我想构建一个自定义警报对话框,人们可以在其中插入新值,例如地址、邮政编码、城市和国家。设置新值后,应用程序更新本地数据库。 当我插入值并单击确定按钮时,应用程序崩溃并且 return 出现致命异常错误。

XML 共 EndSpesa.activity

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>


<TextView
    android:id="@+id/costo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginLeft="40dp"
    android:layout_marginStart="40dp"
    android:layout_marginTop="40dp"
    android:text="Costo articoli: "/>

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/costo2"
    android:layout_toRightOf="@+id/costo"
    android:layout_alignBottom="@id/costo"
    android:layout_marginLeft="12dp"
    />

<TextView
    android:id="@+id/prezzo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/costo2"
    android:layout_toRightOf="@+id/costo2"
    android:text="€"
    />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/iva"
    android:text="iva: "
    android:layout_below="@+id/costo"
    android:layout_alignRight="@+id/costo"
    android:layout_alignEnd="@+id/costo" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/iva2"
    android:layout_below="@+id/costo2"
    android:layout_toLeftOf="@+id/prezzo"
    android:layout_toStartOf="@+id/prezzo" />

<TextView
    android:id="@+id/prezzo4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="€"
    android:layout_alignBottom="@+id/iva2"
    android:layout_toRightOf="@+id/iva2" />


<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/spedizione"
    android:text="Costo di spedizione: "
    android:layout_below="@+id/iva"
    android:layout_alignRight="@+id/iva"
    android:layout_alignEnd="@+id/iva" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/spedizione2"
    android:layout_below="@+id/iva2"
    android:layout_toLeftOf="@+id/prezzo"
    android:layout_toStartOf="@+id/prezzo" />

<TextView
    android:id="@+id/prezzo2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/spedizione2"
    android:layout_toRightOf="@+id/spedizione2"
    android:text="€"
    />

<View
    android:id="@+id/editText3"
    android:layout_below="@+id/spedizione"
    android:layout_width="fill_parent"
    android:layout_height="1dp"
    android:background="#ff000000"
    android:layout_marginBottom="2dip"
    />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/totale"
    android:text="Totale: "
    android:layout_below="@+id/editText3"
    android:layout_alignRight="@+id/spedizione"
    android:layout_alignEnd="@+id/spedizione" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/totale2"
    android:layout_toLeftOf="@+id/prezzo"
    android:layout_toStartOf="@+id/prezzo"
    android:layout_alignBottom="@+id/totale"
    />

<TextView
    android:id="@+id/prezzo3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/totale2"
    android:layout_toRightOf="@+id/totale2"
    android:text="€"
    />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="La spedizione sarà al seguente indirizzo:"
    android:id="@+id/text_spedizione"
    android:layout_below="@+id/totale"
    android:layout_alignLeft="@+id/costo"
    android:layout_alignStart="@+id/costo"
    android:layout_marginTop="38dp" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/indirizzo"
    android:layout_below="@+id/text_spedizione"
    android:layout_alignLeft="@+id/text_spedizione"
    />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/cap"
    android:layout_below="@id/indirizzo"
    android:layout_alignLeft="@id/indirizzo"
    />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/citta"
    android:layout_below="@id/cap"
    android:layout_alignLeft="@id/cap"
    />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/nazione"
    android:layout_below="@+id/citta"
    android:layout_alignLeft="@+id/citta"
    />


<Button
    android:id="@+id/okbutton"
    android:layout_width="96dp"
    android:layout_height="wrap_content"
    android:text="@string/okbutton"
    android:background="#FDFFF6"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginBottom="13dip"
    android:layout_alignRight="@+id/prezzo3"
    android:layout_alignEnd="@+id/prezzo3" />

<Button
    android:id="@+id/cambia"
    android:layout_width="96dp"
    android:layout_height="wrap_content"
    android:text="cambia indirizzo"
    android:background="#FDFFF6"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:layout_alignTop="@+id/login"
    android:layout_marginBottom="13dip"
    android:layout_toRightOf="@+id/login"
    android:layout_toEndOf="@+id/login" />




</RelativeLayout>

XML 的自定义警报对话框

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">

<!-- Indirizzo -->
<EditText

    android:inputType="text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/address_edit"
    android:background="#EFFFC2"
    android:hint="@string/address"
    android:textColor="#000000"
    android:textSize="20sp"
    android:padding="3dip"
    android:layout_marginBottom="5dip"/>

<!-- Città -->
<EditText
    android:layout_below="@+id/address_edit"
    android:inputType="text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/city_edit"
    android:background="#EFFFC2"
    android:hint="@string/city"
    android:textColor="#000000"
    android:textSize="20sp"
    android:padding="3dip"
    android:layout_marginBottom="5dip"/>

<!-- CAP -->
<EditText
    android:layout_below="@+id/city_edit"
    android:inputType="number"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/cap_edit"
    android:background="#EFFFC2"
    android:hint="@string/cap"
    android:textColor="#000000"
    android:textSize="20sp"
    android:padding="3dip"
    android:layout_marginBottom="5dip"/>

<!-- Nazione -->
<EditText
    android:layout_below="@+id/cap_edit"
    android:inputType="text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/nazione_edit"
    android:background="#EFFFC2"
    android:hint="@string/nazione"
    android:textColor="#000000"
    android:textSize="20sp"
    android:padding="3dip"
    android:layout_marginBottom="5dip"/>



</RelativeLayout>

这里是activity

package com.example.spinoshop;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.database.Cursor; 
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.example.spinoshop.model.LoginDataBaseAdapter;


public class EndSpesa extends Activity {

LoginDataBaseAdapter dbprod;


@Override
protected void onCreate(Bundle savedInstanceSaved){
    super.onCreate(savedInstanceSaved);
    setContentView(R.layout.end_spesa);

    // Richiamo la classe e ne prendo il valore
    final GlobalSpesa globalVariable = (GlobalSpesa) getApplicationContext();
    final String tabella_spesa  = globalVariable.getTab();
    int id_ut_l = globalVariable.getId_utente();
    final String id_ut= String.valueOf(id_ut_l);
    int spedizione = 20;                        // imposto subito il massimo della spedizione


    // Mostro il conto
    int Prezzo;
    int Quantita;

    dbprod = new LoginDataBaseAdapter(this);
    dbprod = dbprod.open();
    Cursor cursor_carrello = dbprod.db.rawQuery("SELECT sum(prezzo),sum(quantita) FROM '" + tabella_spesa + "'", null);

    //Mostro l'indirizzo
    Cursor cursor_indirizzo = dbprod.db.rawQuery("SELECT indirizzo,cap,citta,nazione FROM utenti WHERE id_u ="+id_ut+"", null);
    cursor_indirizzo.moveToFirst();

    String indirizzo = cursor_indirizzo.getString(0);
    String cap = new String(cursor_indirizzo.getString(1));
    String citta = new String(cursor_indirizzo.getString(2));
    String nazione = new String(cursor_indirizzo.getString(3));

    String[] Europa = new String[]{"francia","spagna","germania","grecia","olanda"};
    String[] Mondo = new String[]{"afghanistan","cina","giappone"};

    // Controllo dei costi di spedizione


    for (int i = 0; i < Europa.length; ++i) {
        if(nazione.equals(Europa[i])){
            spedizione = 10;
        };
        if (nazione.equals("italia") || nazione.equals("Italia")){
            spedizione = 5;
        }

    }


    if(cursor_carrello.moveToFirst()){
        Prezzo = cursor_carrello.getInt(0);
        Quantita = cursor_carrello.getInt(1);
    }else{
        Prezzo = -1;
        Quantita = -1;
    }
    cursor_carrello.close();

    int costo = Prezzo*Quantita;
    TextView Costo = (TextView) findViewById(R.id.costo2);
    Costo.setText(String.valueOf(costo));

    int iva = (costo*20)/100;
    TextView Iva = (TextView) findViewById(R.id.iva2);
    Iva.setText(String.valueOf(iva));

    TextView spese_spedizione = (TextView) findViewById(R.id.spedizione2);
    spese_spedizione.setText(String.valueOf(spedizione));

    int totale = costo+iva+spedizione;
    TextView Totale = (TextView) findViewById(R.id.totale2);
    Totale.setText(String.valueOf(totale));

    TextView Indirizzo = (TextView) findViewById(R.id.indirizzo);
    Indirizzo.setText(indirizzo);

    TextView CAP = (TextView) findViewById(R.id.cap);
    CAP.setText(cap);

    TextView Citta = (TextView) findViewById(R.id.citta);
    Citta.setText(citta);

    TextView Nazione = (TextView) findViewById(R.id.nazione);
    Nazione.setText(nazione);



    // Cambio indirizzo

    final Button cambia_indirizzo = (Button)findViewById(R.id.cambia);
    cambia_indirizzo.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {

            AlertDialog.Builder cambio = new AlertDialog.Builder(EndSpesa.this);
            LayoutInflater layoutInflater = EndSpesa.this.getLayoutInflater();
            View cambioView = layoutInflater.inflate(R.layout.cambia_indirizzo_dialog, null);
            cambio.setView(cambioView);

            final EditText editTextUserINDIRIZZO = (EditText) findViewById(R.id.address_edit);
            final EditText editTextUserCITTA = (EditText) findViewById(R.id.city_edit);
            final EditText editTextUserCAP = (EditText) findViewById(R.id.cap_edit);
            final EditText editTextUserNAZIONE = (EditText) findViewById(R.id.nazione_edit);


            cambio.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {

                    String userIndirizzo = editTextUserINDIRIZZO.getText().toString();
                    String userCitta = editTextUserCITTA.getText().toString();
                    String userCap = editTextUserCAP.getText().toString();
                    String userNazione = editTextUserNAZIONE.getText().toString();

                    dbprod.db.rawQuery("UPDATE utenti SET indirizzo="+userIndirizzo+", " +
                           "citta="+userCitta+", cap="+userCap+", nazione="+userNazione+" [WHERE id_u ="+id_ut+"]",null);


                }
            });

            // setto il bottone negativo
            cambio.setNegativeButton("Cancel",new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
                }
            });

            // creo l'alert dialog
            AlertDialog alert = cambio.create();
            alert.show();

        }
    });



}
}

这里是日志

04-09 06:19:29.724    3739-3739/com.example.spinoshop E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.spinoshop, PID: 3739
java.lang.NullPointerException
        at com.example.spinoshop.EndSpesa.onClick(EndSpesa.java:130)
        at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5017)
        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:779)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        at dalvik.system.NativeStart.main(Native Method)

我替换

public void onClick(DialogInterface dialog, int id) {

    String userIndirizzo = editTextUserINDIRIZZO.getText().toString();
    String userCitta = editTextUserCITTA.getText().toString();
    String userCap = editTextUserCAP.getText().toString();
    String userNazione = editTextUserNAZIONE.getText().toString();

    dbprod.db.rawQuery("UPDATE utenti SET indirizzo="+userIndirizzo+", " +
               "citta="+userCitta+", cap="+userCap+", nazione="+userNazione+" [WHERE id_u ="+id_ut+"]",null);

}

public void onClick(DialogInterface dialog, int id) {

                   final EditText editTextUserINDIRIZZO = (EditText) cambioView.findViewById(R.id.address_edit);
                   String userIndirizzo = editTextUserINDIRIZZO.getText().toString();

                   final EditText editTextUserCITTA = (EditText)cambioView.findViewById(R.id.city_edit);
                   String userCitta = editTextUserCITTA.getText().toString();

                   final EditText editTextUserCAP = (EditText)cambioView.findViewById(R.id.cap_edit);
                   String userCap = editTextUserCAP.getText().toString();

                   final EditText editTextUserNAZIONE = (EditText)cambioView.findViewById(R.id.nazione_edit);
                   String userNazione = editTextUserNAZIONE.getText().toString();

                    dbprod.db.rawQuery("UPDATE utenti SET indirizzo='"+userIndirizzo+"' ," +
                           "citta=' "+userCitta+"', cap="+userCap+", nazione='"+userNazione+"' WHERE id_u ="+id_ut+"",null);


                }