简体   繁体   中英

Android Dialog Crash on Positive Click

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");
        }
    });


}

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);
    ...

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM