2016-06-14 18 views
0

Ich habe eine DialogFragment verwendet, um eine TimePickerDialog anzuzeigen, wenn Sie eine button drücken, und ich möchte den Text der Schaltfläche auf die neue Zeit festlegen.ANDROID - setOnDismissListener auf einem DialogFragment

Mein Problem ist, kann ich nicht setOnDismissListener auf der DialogFragment von meinem Activity anrufen.

Das ist mein DialogDragment

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; 

    } 
} 

Und das ist , wie ich diese DialogFragment

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

ich schon ein Handler in meinem activity machen gedacht, die die Activityrefresh würde jede Sekunde, aber so würde ich das Problem nicht lösen wollen.

Ich möchte nur, wenn ich meine DialogFragment schließe, meine Taste auf die Zeit eingestellt werden, die ich eingegeben habe.

Danke für Ihre Hilfe.

+0

Mögliches Duplikat von [DialogFragment und onDismiss] (http: // stackoverflow.com/questions/23786033/dialogfragment-and-ondismiss) –

Antwort

3

Sie können die onDismiss(DialogInterface dialog)-Methode überschreiben, die aufgerufen wird, wenn die DialogFragment abgewiesen wird. Sie können es auch tun, aus Ihrer Tätigkeit mit einer Inline-Überschreibung:

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

Danke, das funktioniert gut! – HypnoZ

+0

Android Studio gibt mir eine sehr gute Warnung/Fehler: Fragmente sollten statisch sein! Andernfalls können sie nicht z. nach der Änderung der Ausrichtung ... Dies scheint zu funktionieren, wird aber wahrscheinlich zu mehr Problemen führen – metinkale38

+0

Dies war nur ein kurzes Beispiel. Sie können eine Nicht-Inline-Klasse erstellen, in der Sie sie auf die gleiche Weise überschreiben. –

0

Sie es in Ihrer bereits umgesetzt onTimeSet Methode direkt tun könnten. Sie können die Aktivität erhalten, wo die Timepicker Ansicht eingebettet ist, und aktualisieren Sie die Schaltfläche Text

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

in Ihrer Aktivität Dann YourActivityClass, können Sie die Taste wie gewohnt aktualisieren:

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.

Sie können Sie müssen lediglich die Schnittstelle in Ihre Aktivität implementieren

dann Machen Sie Ihre Aktivität implementieren OnDismissListener

public final class YourActivity extends AppCompatActivity implements DialogInterface.OnDismissListener { 

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

Dann überschreiben Sie einfach die onDismiss listerrenr im Fragment und rufen Sie die Aktivität.

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

Hier ist eine andere Art und Weise zu setOnDismissListener() zum Dialogfragment

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

Um sicherzustellen, dass FragmentTransaction Arbeit durchgeführt wurde. Wir müssen nennen

fm.executePendingTransactions(); 

Ansonsten NullPointerException auftreten können, wenn setOnDismissListener() aufrufen.

Verwandte Themen