2011年12月4日日曜日

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

4日目〜。

---

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

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

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

  1. public class MainActivity extends Activity {  
  2.     @Override  
  3.     public void onCreate(Bundle savedInstanceState) {  
  4.         super.onCreate(savedInstanceState);  
  5.   
  6.         FragmentManager manager = getFragmentManager();  
  7.         MainFragmentDialog dialog = new MainFragmentDialog();  
  8.         dialog.show(manager, "dialog");  
  9.     }  
  10.   
  11.     public class MainFragmentDialog extends DialogFragment {  
  12.   
  13.         @Override  
  14.         public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
  15.             return inflater.inflate(R.layout.main, nullfalse);  
  16.         }  
  17.           
  18.         @Override  
  19.         public Dialog onCreateDialog(Bundle savedInstanceState) {  
  20.             AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());  
  21.             builder.setTitle("タイトル");  
  22.             builder.setPositiveButton("OK"null);  
  23.             builder.setNegativeButton("Cancel"null);  
  24.             return builder.create();  
  25.         }  
  26.     }  
  27. }  


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

  1. public class MainActivity extends Activity {  
  2.     @Override  
  3.     public void onCreate(Bundle savedInstanceState) {  
  4.         super.onCreate(savedInstanceState);  
  5.   
  6.         FragmentManager manager = getFragmentManager();  
  7.         MainFragmentDialog dialog = new MainFragmentDialog();  
  8.         dialog.show(manager, "dialog");  
  9.     }  
  10.   
  11.     public class MainFragmentDialog extends DialogFragment {  
  12.   
  13.         @Override  
  14.         public Dialog onCreateDialog(Bundle savedInstanceState) {  
  15.             LayoutInflater inflater = getActivity().getLayoutInflater();  
  16.             View view = inflater.inflate(R.layout.main, nullfalse);  
  17.             AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());  
  18.             builder.setTitle("タイトル");  
  19.             builder.setPositiveButton("OK"null);  
  20.             builder.setNegativeButton("Cancel"null);  
  21.             builder.setView(view);  
  22.             return builder.create();  
  23.         }  
  24.     }  
  25. }  
これは落ちない。

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



0 件のコメント:

コメントを投稿