安卓 - 在DialogFragment上设置setOnDismissListener

3
我有一个用于显示时间选择器对话框的DialogFragment,当按下按钮时会显示该对话框,并且我想将按钮的文本更改为新设置的时间。
我的问题是,我无法从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");
}

我已经考虑在我的活动中创建一个处理程序,每秒刷新一次该活动,但这不是我想解决问题的方式。 我只希望当我关闭我的DialogFragment时,我的按钮被设置为我输入的时间。 感谢您的帮助。

可能是DialogFragment和onDismiss的重复问题。 - Janki Gadhiya
4个回答

6
这是另一种将 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

这个对我有效,但是你能告诉我为什么我们需要 getSupportFragmentManager().executePendingTransactions() 吗?没有它我的应用程序就会崩溃。谢谢。 - Sam Chen
@SamChen 这个问题大概是视图还没有准备好的问题,如果你是从网页来的话,可以理解为“DOM准备就绪”。在我的情况下,即使调用了executePendingTransactions(),对话框仍然无法找到,这会导致空指针异常。 - Hiro

5

DialogFragment被dismiss时,可以重写onDismiss(DialogInterface dialog)方法。您也可以使用内联覆盖在活动中完成此操作:

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

Android Studio 给了我一个非常好的警告/错误提示:Fragments 应该是静态的!否则,例如在方向更改后,它们无法重新实例化... 这似乎可以工作,但可能会导致更多问题。 - metinkale38
这只是一个简短的例子。您可以创建一个非内联类,在其中以相同的方式覆盖它。 - Daniel Zolnai
@DanielZolnai 如果您将其设置为非内联方式,那么如何从调用DialogFragment的片段或活动之外的位置设置dismiss监听器? - Hiro
请查看其他答案,使用setOnDismissListener - Daniel Zolnai

0

你可以直接在已经实现的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));
}

然后,在您的活动YourActivityClass内部,您可以像往常一样更新按钮:

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

0
我无法从我的Activity中调用DialogFragment上的setOnDismissListener方法。
你可以这样做,只需在你的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监听器并调用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);
        }
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接