Java Android对话框在点击时崩溃
我刚刚创建了一个android对话框,根据以下链接中的教程将结果返回到主机活动(在我的项目中,它是mainActivity): 它说,为了处理您想在dialog中执行的事件,您应该使用dialog类中的接口。然后,在主机活动中,您应该实现这个接口及其方法。但我注意到,只有当正面按钮点击时,它才会崩溃。这是我的密码:Java Android对话框在点击时崩溃,java,android,dialog,crash,Java,Android,Dialog,Crash,我刚刚创建了一个android对话框,根据以下链接中的教程将结果返回到主机活动(在我的项目中,它是mainActivity): 它说,为了处理您想在dialog中执行的事件,您应该使用dialog类中的接口。然后,在主机活动中,您应该实现这个接口及其方法。但我注意到,只有当正面按钮点击时,它才会崩溃。这是我的密码: public class dialogFragement extends DialogFragment { public interface NoticeDialogList
public class dialogFragement extends DialogFragment {
public interface NoticeDialogListener {
public void onDialogPositiveClick(DialogFragment dialog);
public void onDialogNegativeClick(DialogFragment dialog);
}
NoticeDialogListener mListener;
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
try {
// Instantiate the NoticeDialogListener so we can send events to the host
mListener = (NoticeDialogListener) activity;
} catch (ClassCastException e) {
// The activity doesn't implement the interface, throw exception
throw new ClassCastException(activity.toString()
+ " must implement NoticeDialogListener");
}
}
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
builder.setView(inflater.inflate(R.layout.dialog_layout, null))
// Add action buttons
.setPositiveButton("Onayla", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
mListener.onDialogPositiveClick(dialogFragement.this);
}
})
.setNegativeButton("İptal et", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
mListener.onDialogNegativeClick(dialogFragement.this);
}
});
return builder.create();
}
}
在主要活动中:
public void onDialogPositiveClick(DialogFragment dialog) {
EditText et=(EditText)findViewById(R.id.editText1);
dosyaAdi=et.getText().toString();
dosyayaYaz();
}
LogCat错误:
11-29 23:15:01.689: E/SensorManager(23506): thread start
11-29 23:15:16.684: E/AndroidRuntime(23506): FATAL EXCEPTION: main
11-29 23:15:16.684: E/AndroidRuntime(23506): java.lang.NullPointerException
11-29 23:15:16.684: E/AndroidRuntime(23506): at com.example.coordinates.MainActivity.onDialogPositiveClick(MainActivity.java:371)
11-29 23:15:16.684: E/AndroidRuntime(23506): at com.example.coordinates.dialogFragement$1.onClick(dialogFragement.java:54)
11-29 23:15:16.684: E/AndroidRuntime(23506): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:168)
11-29 23:15:16.684: E/AndroidRuntime(23506): at android.os.Handler.dispatchMessage(Handler.java:99)
11-29 23:15:16.684: E/AndroidRuntime(23506): at android.os.Looper.loop(Looper.java:137)
11-29 23:15:16.684: E/AndroidRuntime(23506): at android.app.ActivityThread.main(ActivityThread.java:4517)
11-29 23:15:16.684: E/AndroidRuntime(23506): at java.lang.reflect.Method.invokeNative(Native Method)
11-29 23:15:16.684: E/AndroidRuntime(23506): at java.lang.reflect.Method.invoke(Method.java:511)
11-29 23:15:16.684: E/AndroidRuntime(23506): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
11-29 23:15:16.684: E/AndroidRuntime(23506): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
11-29 23:15:16.684: E/AndroidRuntime(23506): at dalvik.system.NativeStart.main(Native Method)
dosyaz()函数:
private void dosyayaYaz(){
sm.unregisterListener(this); // this is the line 213
File myFile;
myFile= new File("sdcard/"+dosyaAdi.toString()+".csv");
try {
myFile.createNewFile();
FileOutputStream fOut = new FileOutputStream(myFile);
OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);
myOutWriter.append("X Koor;Y Koor;Z Koor");
myOutWriter.append("\n");
dataReader=db.rawQuery("SELECT * FROM Koordinatlar", null);
while(dataReader.moveToNext()){
Float xDeg=(dataReader.getFloat(dataReader.getColumnIndex("xKoor")));
Float yDeg=(dataReader.getFloat(dataReader.getColumnIndex("yKoor")));
Float zDeg=(dataReader.getFloat(dataReader.getColumnIndex("zKoor")));
myOutWriter.append(String.format("%f", xDeg)+";"+String.format("%f", yDeg)+";"+String.format("%f", zDeg));
myOutWriter.append("\n");
}
Toast toast=Toast.makeText(getBaseContext(), "Başarıyla Dosyaya Yazıldı",Toast.LENGTH_SHORT);
toast.show();
sm.registerListener(this, myAccelerometer, SensorManager.SENSOR_DELAY_UI);
}
catch(IOException ex){
Toast toast=Toast.makeText(getBaseContext(), "Dosyaya yazma sırasında bir hata oluştu"+" "+ex.toString(),Toast.LENGTH_LONG);
toast.show();
}
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fm=getFragmentManager();
b1=(Button)findViewById(R.id.button1);
b2=(Button)findViewById(R.id.button2);
b3=(Button)findViewById(R.id.button3);
x=(TextView)findViewById(R.id.textView4);
y=(TextView)findViewById(R.id.textView5);
z=(TextView)findViewById(R.id.textView6);
sm=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
myAccelerometer= sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sm.registerListener(this, myAccelerometer,SensorManager.SENSOR_DELAY_UI);
veritabani= new VeriTabani(this);
db=veritabani.getWritableDatabase();
valuesX= new ArrayList<Float>();
valuesY= new ArrayList<Float>();
valuesZ= new ArrayList<Float>();
zamanDiyagrami= new ArrayList<Float>();
b1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
grafikGoruntule();
}
});
b2.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
verileriSil();
}
});
b3.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
DialogFragment dialog = new dialogFragement();
dialog.show(fm, "MyDialogFragment");
}
});
}
onCreate函数:
private void dosyayaYaz(){
sm.unregisterListener(this); // this is the line 213
File myFile;
myFile= new File("sdcard/"+dosyaAdi.toString()+".csv");
try {
myFile.createNewFile();
FileOutputStream fOut = new FileOutputStream(myFile);
OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);
myOutWriter.append("X Koor;Y Koor;Z Koor");
myOutWriter.append("\n");
dataReader=db.rawQuery("SELECT * FROM Koordinatlar", null);
while(dataReader.moveToNext()){
Float xDeg=(dataReader.getFloat(dataReader.getColumnIndex("xKoor")));
Float yDeg=(dataReader.getFloat(dataReader.getColumnIndex("yKoor")));
Float zDeg=(dataReader.getFloat(dataReader.getColumnIndex("zKoor")));
myOutWriter.append(String.format("%f", xDeg)+";"+String.format("%f", yDeg)+";"+String.format("%f", zDeg));
myOutWriter.append("\n");
}
Toast toast=Toast.makeText(getBaseContext(), "Başarıyla Dosyaya Yazıldı",Toast.LENGTH_SHORT);
toast.show();
sm.registerListener(this, myAccelerometer, SensorManager.SENSOR_DELAY_UI);
}
catch(IOException ex){
Toast toast=Toast.makeText(getBaseContext(), "Dosyaya yazma sırasında bir hata oluştu"+" "+ex.toString(),Toast.LENGTH_LONG);
toast.show();
}
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fm=getFragmentManager();
b1=(Button)findViewById(R.id.button1);
b2=(Button)findViewById(R.id.button2);
b3=(Button)findViewById(R.id.button3);
x=(TextView)findViewById(R.id.textView4);
y=(TextView)findViewById(R.id.textView5);
z=(TextView)findViewById(R.id.textView6);
sm=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
myAccelerometer= sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sm.registerListener(this, myAccelerometer,SensorManager.SENSOR_DELAY_UI);
veritabani= new VeriTabani(this);
db=veritabani.getWritableDatabase();
valuesX= new ArrayList<Float>();
valuesY= new ArrayList<Float>();
valuesZ= new ArrayList<Float>();
zamanDiyagrami= new ArrayList<Float>();
b1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
grafikGoruntule();
}
});
b2.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
verileriSil();
}
});
b3.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
DialogFragment dialog = new dialogFragement();
dialog.show(fm, "MyDialogFragment");
}
});
}
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fm=getFragmentManager();
b1=(按钮)findViewById(R.id.button1);
b2=(按钮)findViewById(R.id.button2);
b3=(按钮)findViewById(R.id.button3);
x=(TextView)findViewById(R.id.textView4);
y=(TextView)findViewById(R.id.textView5);
z=(TextView)findViewById(R.id.textView6);
sm=(SensorManager)getSystemService(Context.SENSOR\u服务);
MyAccelerator=sm.getDefaultSensor(传感器类型\加速计);
sm.registerListener(此、MyAccelerator、SensorManager.SENSOR\u DELAY\u UI);
veritabani=新veritabani(本);
db=veritabani.getWritableDatabase();
valuesX=新的ArrayList();
valuesY=newarraylist();
valuesZ=newarraylist();
zamanDiyagrami=新ArrayList();
b1.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
//TODO自动生成的方法存根
grafikGoruntule();
}
});
b2.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
//TODO自动生成的方法存根
verileriSil();
}
});
b3.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
//TODO自动生成的方法存根
DialogFragment dialog=新建dialogFragement();
显示(fm,“MyDialogFragment”);
}
});
}
来自LogCat:
java.lang.NullPointerException
at com.example.coordinates.MainActivity.dosyayaYaz(MainActivity.java:213)
以及您的代码:
sm.unregisterListener(this); // this is the line 213
然后变量sm
为空,您需要使用以下命令对其进行初始化:
sm = ...
添加
从您目前发布的内容来看,我不明白为什么
sm
是null
。但在dosyaz()
中,您始终可以执行以下操作:
if(sm == null)
sm=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
sm.unregisterListener(this); // this is the line 213
(但最好设法找到sm
为null
的确切原因)
添加
新的LogCat错误显示您试图在MainActivity中找到一个视图,该视图实际上是DialogFragment的一部分。。。也许在
doPositiveClick()中可以使用:
public void onDialogPositiveClick(DialogFragment dialog) {
// Add this: vvvvvvvvvvvvvvvvvvv
EditText et=(EditText)dialog.getDialog().findViewById(R.id.editText1);
...
为了避免破坏它的良好实践,在调用侦听器之前总是检查它们的null
,因此您的代码如下所示
if(mListener != null)
mListener.onDialogPositiveClick(dialogFragement.this);
// Similarly for negative button
您的错误的其他可能原因是您没有在主机活动中实现接口。您必须在调用活动中实现NoticeDialogListener。发布您的LogCat错误,这样我们就可以看到发生了什么。java.lang.NullPointerException位于com.example.coordinates.MainActivity.dosyayaz(MainActivity.java:213)
对话框片段很好。问题出在dosyaz()
,特别是第213行。发布此方法并指出哪一行是213。请发布dosyaz()的内容。错误在那里-第213行我已添加,并在代码中指向带有注释的第213行。可能的问题是,在“sm.unregisterListener(this)”中,“sm”为空。看一看iti在onCreate中初始化了它。我已经更新了logcat,但它与第一个版本似乎没有什么不同。有趣的是,它只是在点击肯定按钮时崩溃了。可能是虫子吗?@metzelder我不认为是虫子。LogCat已更改,您可以看到它现在在第371行崩溃。这似乎是dosyaAdi=et.getText().toString()
这意味着EditText et
不在activity\u main.xml
中。哦,是的。通过这个对话框,我创建并使用了一个布局。这个布局包含editText1。我在主活动类中使用了editText1,因为我可以从R访问它。