2016-06-14 18 views
0

buttonを押したときにTimePickerDialogを表示するのに使われました。ボタンのテキストを新しい時間設定に変更したいと思います。DialogFragmentのANDROID - setOnDismissListener

私の問題はDialogFragmentsetOnDismissListenerを私のActivityから呼び出すことができません。

これは

public class TimePickerFragment extends DialogFragment 
     implements TimePickerDialog.OnTimeSetListener { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     int hour = Application.getSettings().getInt("hour", 11); 
     int minute = Application.getSettings().getInt("minute", 11); 

     // Create a new instance of TimePickerDialog and return it 
     return new TimePickerDialog(getActivity(), this, hour, minute, 
       DateFormat.is24HourFormat(getActivity())); 
    } 

    @Override 
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 
     FirstTimeLaunchSettingsActivity.hours = hourOfDay; 
     FirstTimeLaunchSettingsActivity.minutes = minute; 

    } 
} 

私DialogDragmentであり、これは私が、私はすでにActivityrefreshでしょう私のactivityHandlerを作る考えた

public void showTimePickerDialog(View v) { 
    DialogFragment newFragment = new TimePickerFragment(); 
    newFragment.show(this.getFragmentManager(), "timePicker"); 
} 

このDialogFragmentを呼び出す方法ですすべてのseconde、しかしそれは私が問題を解決したいと思う方法ではない。

私が欲しいのは、私がDialogFragmentを閉じるときに、私のボタンは入力した時間に設定されています。

ありがとうございました。

+0

[DialogFragmentとonDismiss]の可能な複製(http:// stackoverflow。com/questions/23786033/dialogfragment-and-ondismiss) –

答えて

3

onDismiss(DialogInterface dialog)メソッドをオーバーライドすることができます。これはDialogFragmentが終了したときに呼び出されます。また、インラインオーバーライドして、あなたの活動からそれを行うことができます。

public void showTimePickerDialog(View v) { 
    DialogFragment newFragment = new TimePickerFragment() { 
     @Override 
     public void onDismiss(DialogInterface dialog){ 
      // Add your code here 
     } 
    }; 
    newFragment.show(this.getFragmentManager(), "timePicker"); 
} 
+0

ありがとうございます、うまくいきました! – HypnoZ

+0

Android Studioは私に非常に良い警告/エラーを与えます:フラグメントは静的でなければなりません!さもなければ、それらは再びインスタンス化することができません。オリエンテーション変更後...これはうまくいくように思えますが、おそらくもっと多くの問題につながります – metinkale38

+0

これはほんの一例です。同じ方法でオーバーライドする非インラインクラスを作成できます。 –

0

あなたはすでに実装onTimeSetメソッドの中で直接それを行うことができます。

public void updateButton(String newText) { 
    Button yourButton = (Button) findViewById(R.id.yourButtonID); 
    yourButton.setText(newText); 
} 
0

I can't call setOnDismissListener on the DialogFragment from my Activity.

することができます:あなたは

@Override 
public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 
    FirstTimeLaunchSettingsActivity.hours = hourOfDay; 
    FirstTimeLaunchSettingsActivity.minutes = minute; 

    YourActivityClass activity = (YourActivityClass) getActivity(); 
    activity.updateButton(hourOfDay + ":" + (minute<10?"0"+minute:minute)); 
} 

そして、ボタンのテキストをTimePickerビューが埋め込まれているアクティビティを取得し、更新することができ、あなたの活動YourActivityClassの内側に、あなたはいつものように、ボタンを更新することができますアクティビティにインターフェイスを実装するだけです。

次にアクティビティを実装します。OnDismissListener

public final class YourActivity extends AppCompatActivity implements DialogInterface.OnDismissListener { 

    @Override 
    public void onDismiss(final DialogInterface dialog) { 
     //Fragment dialog had been dismissed 
    } 
} 

次に、フラグメント内のonDismiss listerenrをオーバーライドし、アクティビティを呼び出します。ここで

public final class DialogFragmentImage extends DialogFragment { 
    @Override 
    public void onDismiss(final DialogInterface dialog) { 
     super.onDismiss(dialog); 
     final Activity activity = getActivity(); 
     if (activity instanceof DialogInterface.OnDismissListener) { 
      ((DialogInterface.OnDismissListener) activity).onDismiss(dialog); 
     } 
    } 

} 
1

はFragmentTransaction作業が行われていることを確認するためのダイアログフラグメント

FragmentManager fm = getFragmentManager(); 

YourDialogFragment dialog = new YourDialogFragment(); 
dialog.show(fm,"Dialog Name"); 

fm.executePendingTransactions(); 
dialog.getDialog().setOnDismissListener(new DialogInterface.OnDismissListener() { 
        @Override 
        public void onDismiss(DialogInterface dialogInterface) { 
         //action when dialog is dismissed goes here 
        } 
       }); 

からsetOnDismissListener()に別の方法です。私たちは、setOnDismissListener()を呼び出すとき

fm.executePendingTransactions(); 

そうでない場合NullPointerExceptionが発生する可能性があり呼び出す必要があります。

関連する問題