2011年12月4日日曜日

Android DialogFragmentを使うときの注意点。

4日目〜。

---

DialogFragment で表示される Dialog を指定するための主なメソッドは次の2つ。 onCreateView() と onCreateDialog()。

Dialog のテーマと ContentView の中身だけ指定すればいい場合は onCreateView() の方だけを Override すればいいのですが、例えば OK と Cancel のある AlertDialog を作ろうとしたときは onCreateDialog() を Override して、表示したい AlertDialog のインスタンスを返すようにします。

このときに、onCreateView() で null 以外を返していると落ちます。

public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); FragmentManager manager = getFragmentManager(); MainFragmentDialog dialog = new MainFragmentDialog(); dialog.show(manager, "dialog"); } public class MainFragmentDialog extends DialogFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.main, null, false); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle("タイトル"); builder.setPositiveButton("OK", null); builder.setNegativeButton("Cancel", null); return builder.create(); } } }

12-04 22:51:37.099: E/AndroidRuntime(586): Caused by: android.util.AndroidRuntimeException: requestFeature() must be called before adding content

onCreateView() を Override せずに、onCreateDialog() で返す AlertDialog に対して setView() するのはOK

public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); FragmentManager manager = getFragmentManager(); MainFragmentDialog dialog = new MainFragmentDialog(); dialog.show(manager, "dialog"); } public class MainFragmentDialog extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { LayoutInflater inflater = getActivity().getLayoutInflater(); View view = inflater.inflate(R.layout.main, null, false); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle("タイトル"); builder.setPositiveButton("OK", null); builder.setNegativeButton("Cancel", null); builder.setView(view); return builder.create(); } } } これは落ちない。

onCreateDialog() を Override しないとほんとに単純なダイアログしかだせないよねー。。。



0 件のコメント:

コメントを投稿