我正在尝试创建一个对话框,在用户注销之前向用户显示倒计时。超时是从另一个 Activity 设置的。
我编写了以下代码:
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.content.res.Resources;
import android.os.Bundle;
public class SessionInactivityDialog extends DialogFragment {
public void setInactivityTimeout(long timeout) {
Resources res = getActivity().getResources();
String text = String.format(res.getString(R.string.iminent_logout_text), (timeout / 1000));
((AlertDialog)getDialog()).setMessage(text);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.iminent_logout);
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
SessionActivity activity = (SessionActivity)getActivity();
activity.resetTimer();
}
});
return builder.create();
}
}
使用以下几行调用该对话框:
private void showIminentLogoutDialog(long timeout) {
mInactivityDialog.show(getFragmentManager(), TAG);
mInactivityDialog.setInactivityTimeout(timeout);
}
即使在对话框打开后设置了超时,setInactivityTimeout()
中的 getActivity()
仍为 null
。
如何正确获取fragment中的资源?
最佳答案
DialogFragment.show()
是异步的 - DialogFragment
实际上并没有立即显示 - 它被发送到消息队列的末尾。我建议提供超时值作为参数,然后将其与标题一起设置在 onCreateDialog()
中。例如:
public class SessionInactivityDialog extends DialogFragment {
public static final String EXTRA_TIMEOUT = "timeout";
public static SessionInactivityDialog newInstance(long timeout) {
Bundle args = new Bundle();
args.putLong(EXTRA_TIMEOUT, timeout);
SessionInactivityDialog dialog = new SessionInactivityDialog();
dialog.setArguments(args);
return dialog;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final SessionActivity activity = (SessionActivity) getActivity();
final long timeout = getArguments().getLong(EXTRA_TIMEOUT);
final String msg = activity.getString(R.string.imminent_logout_text, (timeout / 1000));
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle(R.string.imminent_logout);
builder.setMessage(msg);
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
activity.resetTimer();
}
});
return builder.create();
}
}
然后你可以用以下方式显示它:
SessionInactivityDialog.newInstance(timeout)
.show(getFragmentManager(), TAG);
我还建议为对话框创建一个与 Activity 通信的接口(interface),而不是添加对 SessionActivity
的直接依赖(这样您就可以在任何 Activity,只要它实现了您的接口(interface))。
关于Android DialogFragment getActivity() 为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22490687/