ANDROID - 在 DialogFragment 上设置 OnDismissListener

ANDROID - setOnDismissListener on a DialogFragment

我有一个 DialogFragment 用于在按下 button 时显示 TimePickerDialog,我想将按钮的文本更改为新的时间设置。

我的问题是我无法通过 Activity.

DialogFragment 上调用 setOnDismissListener

这是我的 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;

    }
}

这就是 我如何称呼这个 DialogFragment

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

我已经考虑过在我的 activity 中制作一个 Handler,这将 refresh 每秒 Activity,但这不是我想要解决的方式问题。

我只想在关闭 DialogFragment 时将我的按钮设置为我输入的时间。

感谢您的帮助。

您可以覆盖 onDismiss(DialogInterface dialog) 方法,该方法将在 DialogFragment 被关闭时调用。您也可以使用内联覆盖从 activity 执行此操作:

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

您可以直接在已经实现的 onTimeSet 方法中执行此操作。您可以获得嵌入 TimePicker 视图的 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));
}

然后,在您的 activity YourActivityClass 中,您可以照常更新按钮:

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

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

可以,您只需在 activity

中实现接口

然后让你的 Activity 实现 OnDismissListener

public final class YourActivity extends AppCompatActivity implements DialogInterface.OnDismissListener {

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

然后只需覆盖片段中的 onDismiss listerenr 并调用 Activity。

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

}

这是 setOnDismissListener() 对话片段的另一种方法

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

确保已执行 FragmentTransaction 工作。我们需要打电话

fm.executePendingTransactions();

否则调用setOnDismissListener()时可能出现NullPointerException