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.
I wrote the following code:
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);
}
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()
is asynchronous -- theDialogFragment
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 inonCreateDialog()
along with the title. For example:Then you can just show it with:
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).