DialogFragmentのsetShowsDialog
※ソースを完全に読んだ訳じゃないので若干微妙なのであくまでネタとして
例えば、DialogFragmentを継承したクラスを作りsetArgumentsでandroid.os.Bundleを指定してパラメーターを渡す。そこまでは良いのだけど、そのパラメーターに値が入ってないとかgetSerializableなりはできるけどnullが返ってきてるような場合でそのままonCreateDialogを実行されてしまうとNPEなりの問題が発生してくる訳。そこら辺の制御とか辺りどうするのかって所なんですが
package shareroid.app;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.util.Log;
public class UrlOpenDialogFragment extends DialogFragment {
private static final String TAG = UrlOpenDialogFragment.class.getName();
private Activity mActivity;
private Share mShare;
public static DialogFragment newInstance(Share share) {
Bundle bundle = new Bundle();
// 例えばここのshareがnullだったらどうなるか
bundle.putSerializable("share", share);
UrlOpenDialogFragment dialogFragment = new UrlOpenDialogFragment();
dialogFragment.setArguments(bundle);
return dialogFragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
Log.v(TAG, "onCreate");
super.onCreate(savedInstanceState);
mActivity = getActivity();
Bundle arguments = getArguments();
if (arguments != null && arguments.containsKey("share"))
mShare = (Share)arguments.getSerializable("share");
if (mShare == null) {
setShowsDialog(false);
}
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Log.v(TAG, "onCreateDialog");
AlertDialog.Builder builder = new AlertDialog.Builder(mActivity);
builder.setMessage(mShare.getUrl());
return builder.create();
}
}
そういう場合にはsetShowsDialogをfalseにすれば良い。但し、ここの評価はgetLayoutInflaterでonCreateDialogが呼び出される
@Override
public LayoutInflater getLayoutInflater(Bundle savedInstanceState) {
if (!mShowsDialog) {
return super.getLayoutInflater(savedInstanceState);
}
mDialog = onCreateDialog(savedInstanceState);
っていう風にsetShowsDialog(false)にした場合だとmDialogが初期化されない
@Override
public void onStart() {
super.onStart();
if (mDialog != null) {
mViewDestroyed = false;
mDialog.show();
}
}
っていう風にmDialogが生成されているかをチェックされてダイアログを表示するような仕組みになっている。
んまぁ若干遠回りしたけど要は「setShowsDialog(false)にするとonCreateDialogは走らない」っていう事なんじゃないかと。他に条件があるのかは定かじゃないけど
とりまぁ調べてみたのでメモっておく