我想构建一个自定义警报对话框,其中一个人可以插入新值,如地址,邮政编码,城市和国家。设置新值后,应用程序将更新本地数据库。 当我插入值并单击“确定”按钮时,应用程序崩溃并返回“致命异常”错误。
EndSpesa.activity的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"
>
<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>
这里的活动
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$1$1.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)
答案 0 :(得分:0)
我替换
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);
}