Android DialogFragment getActivity() 为 null

标签 android nullpointerexception android-alertdialog dialogfragment

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

相关文章:

java - 警报 Dialog.Builder(??)

Android - 尽管我仍然连接到 WiFi,但我如何检测到我的应用已失去互联网连接

android - 回收站 View : How to determine when scrollToPosition() has finished binding the ViewHolders

java - 为什么我在这里得到 JsonSyntaxException?

flutter - 在 flutter 中自动在应用程序主屏幕加载上显示警报对话框

java - Android - 以编程方式设置警报对话框上的文本颜色列表项

java - Android - 动态大型 TextView

android - fragment 中 OnClickListener 的 NullPointerException

jakarta-ee - "Exception while loading the app"没有堆栈跟踪

java - 无法在方法中访问数组?