1

このリンクからのチュートリアルに従って、ホストアクティビティ(私のプロジェクトではmainActivity)に結果を返すAndroidダイアログを作成しました:http://developer.android.com/guide/topics/ui/dialogs.html

ダイアログで実行したいイベントを処理するには、ダイアログクラスでインターフェイスを使用する必要があると書かれています。次に、ホストアクティビティで、このインターフェイスとそのメソッドを実装する必要があります。しかし、正のボタンがクリックされたときにのみクラッシュすることに気づきました。これが私のコードです:

  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)

dosyayaYaz()関数:

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関数:

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


}
4

2 に答える 2

2

LogCatから:

java.lang.NullPointerException 
    at com.example.coordinates.MainActivity.dosyayaYaz(MainActivity.java:213)

そしてあなたのコード:

sm.unregisterListener(this); // this is the line 213

次に、変数smがnullの場合、次のように初期化する必要があります。

sm = ...

追加これまでに投稿した内容から、なぜな
のかわかりません。しかし、あなたはいつでもこれを行うことができます:smnulldosyayaYaz()

if(sm == null)
    sm=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
sm.unregisterListener(this); // this is the line 213

(しかし、その理由を正確に見つけようとするのが最善smですnull。)


追加
新しいLogCatエラーは、実際にはDialogFragmentの一部であるMainActivityのビューを見つけようとしていることを示していました...おそらく内部でdoPositiveClick()次を使用できます。

public void onDialogPositiveClick(DialogFragment dialog) {
    //         Add this:  vvvvvvvvvvvvvvvvvvv
    EditText et=(EditText)dialog.getDialog().findViewById(R.id.editText1);
    ...
于 2012-11-29T21:04:51.737 に答える
1

クラッシュを回避するために、リスナーをnull呼び出す前に常にリスナーをチェックすることをお勧めします。そのため、コードは次のようになります。

if(mListener != null)
    mListener.onDialogPositiveClick(dialogFragement.this);
// Similarly for negative button

エラーのその他の考えられる理由は、ホストアクティビティにインターフェイスを実装していないためです。NoticeDialogListener呼び出しアクティビティに実装する必要があります。

于 2014-06-04T09:24:04.150 に答える