---
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 件のコメント:
コメントを投稿