Java 未调用DialogFragment OnDismissListener
我刚刚做了一个构建,注意到我的代码不起作用,在设置了一些断点之后,我看到,实际上,discover();方法被调用,但问题是没有调用侦听器,因此侦听器中的代码永远不会执行。 我有我的片段A,在这里我显示了我的DialogFragment(DateDialog),当DateDialog被取消时,我有权从片段A中获取一些DateDialog值,但它不起作用。 这是我的原始代码,它不起作用:Java 未调用DialogFragment OnDismissListener,java,android,Java,Android,我刚刚做了一个构建,注意到我的代码不起作用,在设置了一些断点之后,我看到,实际上,discover();方法被调用,但问题是没有调用侦听器,因此侦听器中的代码永远不会执行。 我有我的片段A,在这里我显示了我的DialogFragment(DateDialog),当DateDialog被取消时,我有权从片段A中获取一些DateDialog值,但它不起作用。 这是我的原始代码,它不起作用: //DATEDIALOG @Nullable @Override public View o
//DATEDIALOG
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.datedialog, container, false);
localf = android.text.format.DateFormat.getMediumDateFormat(getContext());
TomorrowB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
setTomorrow();
HasDate = true;
dismiss();
}
});
return v;
}
//FRAGMENT A
DateB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final DateDialog d = new DateDialog();
d.show(getChildFragmentManagaer(), "DateDialog");
getChildFragmentManager().executePendingTransactions();
d.getDialog().setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
if (d.HasDate())
{
DoStuff();
}
}
});
然后,我决定用一个接口来更新它,但它也不起作用
//DATEDIALOG
public interface DismissListener{
void onDialogDismiss(DateDialog d);
}
private DismissListener mListener;
public void setDismissListener(DismissListener listener){
mListener = listener;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.datedialog, container, false);
localf = android.text.format.DateFormat.getMediumDateFormat(getContext());
TomorrowB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
setTomorrow();
HasDate = true;
dismiss();
}
});
return v;
}
//FRAGMENT A
DateB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final DateDialog d = new DateDialog();
d.setDismissListener(new DateDialog.DismissListener() {
@Override
public void onDialogDismiss(DateDialog d) {
if (d.HasDate())
{
DoStuff();
}
}
我也尝试了OnCancelListener(),但它是一样的。附言:
这确实有效,直到几天前,我不知道我从支持库迁移到AndroidX库是否有任何关系。这是因为您迁移到AndroidX。 在AndroidX中注册Disclose侦听器的新方法称为onDismiss(),而不是setOnDismissListener()。您可以参考文档。实际上,androidstudio应该在编译时为您提供使用错误方法的错误信息。可能您已经实现了这两个库。 因此,您的代码(来自第一个示例)应该如下所示:
d.onDismiss(new DialogInterface() {
@Override
public void cancel() {
}
@Override
public void dismiss() {
}
});
这是因为您迁移到AndroidX。 在AndroidX中注册Disclose侦听器的新方法称为onDismiss(),而不是setOnDismissListener()。您可以参考文档。实际上,androidstudio应该在编译时为您提供使用错误方法的错误信息。可能您已经实现了这两个库。 因此,您的代码(来自第一个示例)应该如下所示:
d.onDismiss(new DialogInterface() {
@Override
public void cancel() {
}
@Override
public void dismiss() {
}
});
根据:
注意:DialogFragment拥有和回调您不能自己设置这些事件。要了解这些事件,请覆盖和
情况一直如此
您应该创建自己的回调接口,并从DateDialog的onDismiss()
调用该接口,而不是直接调用setOnDismissListener
:
class DateDialog {
interface DismissListener {
void onDismiss(boolean hasDate)
}
private DismissListener listener = null;
public void setDismissListener(DismissListener listener) {
this.listener = listener;
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
if (listener != null) {
listener.onDismiss(HasDate);
}
}
}
然后像这样使用它:
final DateDialog d = new DateDialog();
d.show(getChildFragmentManager(), "DateDialog");
getChildFragmentManager().executePendingTransactions();
d.setDismissListener(new DismissListener() {
@Override
public void onDismiss(boolean hasDate) {
if (hasDate) {
DoStuff();
}
}
});
根据:
注意:DialogFragment拥有和回调您不能自己设置这些事件。要了解这些事件,请覆盖和
情况一直如此
您应该创建自己的回调接口,并从DateDialog的onDismiss()
调用该接口,而不是直接调用setOnDismissListener
:
class DateDialog {
interface DismissListener {
void onDismiss(boolean hasDate)
}
private DismissListener listener = null;
public void setDismissListener(DismissListener listener) {
this.listener = listener;
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
if (listener != null) {
listener.onDismiss(HasDate);
}
}
}
然后像这样使用它:
final DateDialog d = new DateDialog();
d.show(getChildFragmentManager(), "DateDialog");
getChildFragmentManager().executePendingTransactions();
d.setDismissListener(new DismissListener() {
@Override
public void onDismiss(boolean hasDate) {
if (hasDate) {
DoStuff();
}
}
});
如果我添加该代码,对话框不会显示,但是如果我不编写它,它会显示,但是,主要问题仍然存在。
onDismiss
是当对话框被取消时,DialogFragment
调用自己的回调,而不是如何为取消事件注册侦听器。如果我添加该代码,对话框不会显示,但是,如果我不写,它会写,但是,主要的问题仍然存在。onDismiss
是当对话框被解除时,DialogFragment
调用自己的回调,而不是如何为解除事件注册侦听器。