我想启动一个带有自定义布局的对话框,我已经通过DialogFragment实现了该对话框.(我基本上只是改变了onCreateView()并添加了按钮处理程序).该对话框允许用户快速更改重要设置.
该对话框将从几个不同的活动中启动.不同的活动没有太多共同之处,只是在用户更改设置后需要刷新.他们不需要从对话中获取任何信息; 他们只需要知道何时关闭(被解雇).
我尝试在onResume()中刷新活动,但启动和解除对话框似乎永远不会调用此方法.(所以我不确定它为什么会存在,但这可能是另一个问题的主题.)
接下来,我尝试在对话框中添加DialogInterface.OnDismissListener:
public static void showMyDialog(OnDismissListener listener, Activity activity)
{
DialogFragment fragment = new MyDialogFragment();
fragment.show(activity.getFragmentManager(), "date");
activity.getFragmentManager().executePendingTransactions();//A
fragment.getDialog().setOnDismissListener(listener);//B
}
Run Code Online (Sandbox Code Playgroud)
当我最初省略A行时,我在B行得到了NullPointerException,因为此时对话框为null.根据这个SO答案的建议,我调用了executePendingTransaction().这会在B行导致IllegalStateException,并且消息"OnDismissListener已被DialogFragment占用,无法替换." 我也尝试在调用show()之前放入setOnDismissListener(),但这总是导致NullPointerException.
然后我读了另一个SO答案,其中说原始提问者"在DialogFragment的生命周期中过早地调用getDialog()." 所以我尝试在DialogFragment中添加一个构造函数:
public MyDialogFragment(SomeCallback illTakeAnythingICanGet)
{
//I'll store the callback here and call it later
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,添加一个构造函数让Android Lint发出致命的警告,当我查了一下时,我在这个问题中发现了一条评论,似乎说这种方法会让对话无法处理用户在对话框中旋转屏幕开了.
如果用户旋转屏幕,当DialogFragment关闭(被解雇)的方式不会破坏我的应用程序时,活动如何计算?我应该在DialogFragment之外使用其他东西吗?
Imp*_*Dev 32
这只是对harism评论的更长时间的解释,以防其他人遇到同样的问题.
您可以通过创建这样的界面来完成我想要的任务:
public interface MyDialogCloseListener
{
public void handleDialogClose(DialogInterface dialog);//or whatever args you want
}
Run Code Online (Sandbox Code Playgroud)
有启动对话框的活动(DialogFragment)实现此接口.然后给DialogFragment提供以下方法:
public void onDismiss(DialogInterface dialog)
{
Activity activity = getActivity();
if(activity instanceof MyDialogCloseListener)
((MyDialogCloseListener)activity).handleDialogClose(dialog);
}
Run Code Online (Sandbox Code Playgroud)
sha*_*aby 15
有人做同样的更多解释性代码.
创建interface
as:
package com.example.dialoglistener;
import android.content.DialogInterface;
public interface MyDialogCloseListener {
public void handleDialogClose(DialogInterface dialog);
}
Run Code Online (Sandbox Code Playgroud)
在activity中实现接口:
MyDialogCloseListener closeListener = new MyDialogCloseListener() {
@Override
public void handleDialogClose(DialogInterface dialog) {
//do here whatever you want to do on Dialog dismiss
}
};
Run Code Online (Sandbox Code Playgroud)
写DismissListener
在DialogFragement
如
public void DismissListener(MyDialogCloseListener closeListener) {
this.closeListener = closeListener;
}
Run Code Online (Sandbox Code Playgroud)
DismissListener
从您的活动致电:
dialogFragementObject.DismissListener(closeListener);
Run Code Online (Sandbox Code Playgroud)
最后写onDismiss
方法
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
if(closeListener != null) {
closeListener.handleDialogClose(null);
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
26037 次 |
最近记录: |