Reputation: 714
I've just created an android dialog that returns results to the host activity ( in my project, it's mainActivity) according to the tutorial from this link: http://developer.android.com/guide/topics/ui/dialogs.html
It says in order to handle the event you want to do in dialog, you should use interface in the dialog class. And then, in the host activity, you should implement this interface and its methods. But i've noticed that it only crashes when positive button click. Here are my codes:
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();
}
}
in the main activity :
public void onDialogPositiveClick(DialogFragment dialog) {
EditText et=(EditText)findViewById(R.id.editText1);
dosyaAdi=et.getText().toString();
dosyayaYaz();
}
LogCat errors:
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)
dosyayaYaz() function:
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();
}
}
onCreate function:
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");
}
});
}
Upvotes: 1
Views: 1331
Reputation: 1206
In order to avoid crashing its good practice to always check Listeners for null
before calling them, so your code look like this
if(mListener != null)
mListener.onDialogPositiveClick(dialogFragement.this);
// Similarly for negative button
Other Possible reason of your error is because you are not implementing interface in host activity. You must implement NoticeDialogListener
in your Calling activity.
Upvotes: 1
Reputation: 86948
From the LogCat:
java.lang.NullPointerException
at com.example.coordinates.MainActivity.dosyayaYaz(MainActivity.java:213)
And your code:
sm.unregisterListener(this); // this is the line 213
Then the variable sm
in null, you need to initialize it with:
sm = ...
Addition
From what you have posted so far, I don't see why sm
is null
. But in dosyayaYaz()
you can always do this:
if(sm == null)
sm=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
sm.unregisterListener(this); // this is the line 213
(But it is best to try to find the exact reason why sm
is null
.)
Addition
The new LogCat error showed that you were trying to find a View in MainActivity that was actually a part of the DialogFragment... Perhaps inside doPositiveClick()
you can use:
public void onDialogPositiveClick(DialogFragment dialog) {
// Add this: vvvvvvvvvvvvvvvvvvv
EditText et=(EditText)dialog.getDialog().findViewById(R.id.editText1);
...
Upvotes: 2