gpt4 book ai didi

Android DialogFragment getActivity() 为空

转载 作者:行者123 更新时间:2023-11-29 17:51:39 26 4
gpt4 key购买 nike

我正在尝试创建一个对话框,在用户注销之前向用户显示倒计时。超时是从另一个 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);

我还建议为对话框创建一个接口(interface)来与 Activity 通信,而不是添加对 SessionActivity 的直接依赖(这样你就可以在任何 Activity,只要它实现了您的界面)。

关于Android DialogFragment getActivity() 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22490687/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com