Android DialogFragment getActivity()为null [英] Android DialogFragment getActivity() is null

查看:402
本文介绍了Android DialogFragment getActivity()为null的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个对话框,该对话框在注销用户之前向用户显示倒计时.超时是从另一个活动设置的.

I am trying to create a dialog which displays the user a countdown before the user is logged out. The timeout is set from another 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();
    }

}

使用以下这些行来调用对话框:

The dialog is called with these lines:

private void showIminentLogoutDialog(long timeout) {
    mInactivityDialog.show(getFragmentManager(), TAG);
    mInactivityDialog.setInactivityTimeout(timeout);
}

即使在对话框打开后设置了超时,但setInactivityTimeout()中的getActivity()null.

Even though the timeout is set after the dialog has opened, getActivity() in setInactivityTimeout() is null.

如何正确获取片段中的资源?

How do I get the resources in the fragment correctly?

推荐答案

DialogFragment.show()是异步的-DialogFragment实际上并没有立即显示-它已发送到消息队列的末尾.我建议提供超时值作为参数,然后在onCreateDialog()中将其与标题一起设置.例如:

DialogFragment.show() is asynchronous -- the DialogFragment isn't actually immediately displayed -- it's sent to the end of the message queue. I'd suggest providing the timeout value as an argument, and then set it in onCreateDialog() along with the title. For example:

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();
    }
}

然后您可以通过以下方式显示它:

Then you can just show it with:

SessionInactivityDialog.newInstance(timeout)
                       .show(getFragmentManager(), TAG);

我还建议为对话框创建一个与活动进行通信的界面,而不是直接添加对SessionActivity的依赖关系(这样,您就可以在 any 活动中重用此功能了,因为它实现了您的界面).

I'd also suggest making an interface for the dialog to communicate with the activity, rather than adding the direct dependency on SessionActivity (that way you can reuse this in any Activity, as long as it implements your interface).

这篇关于Android DialogFragment getActivity()为null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆