« ABC2013秋に行ってきて。その2 | トップページ | 「陽だまりの彼女」を読んで »

2013年11月10日 (日)

DialogFragmentって変な作り。。

とあることで、
DialogFragmentの
ソースをがっつり見てしまった。

DialogFragmentは、
Fragmentを敬称しているから、
フラグメントなんだろうと思ってたが、
どうもそうじゃない印象のほうが強い。

ある意味、変なフラグメント。


元々Dialogの仕組みがあったから、
使い方を合わせたかったのだと思うが、
そのためかどうか、
動きがフラグメントっぽくない。


DialogFramentを使うとき、
onCreateDialog()をオーバーライドして、
show()メソッドで、表示させる。
(onCreateView()をオーバーライドする方法もあるけど)

使い方の詳細は、
DevelopersのページのDialogFragmentを見ると書いてある。

とりあえず、ここから
onCreateDialog()をオーバーライドする方法で、
しかも、なぜか、4.0.4ぐらいのソースを見ての感想。

ソースコードはいつも
Developer Collaboration Project
にお世話になってる。

今回対象となるソースは、ここ

簡単なところから見ると、
表示するには、show()メソッド

単純に、フラグメント追加を
肩代わりしているだけらしい。
今までのDialogの使い方そのままという意志が
ここから読み取れる。
フラグメントにはないメソッドだしね。


そして、onCreateDialog()メソッド。

この関数だけ見ると、
特に思う所もない。
だけど、
この関数がどう使われているかが、
フラグメントっぽくないなって感じるところ。

使うべきDialogクラスを作るためのメソッド。
それは分かるけども、
フラグメントでViewを作る役割の
onCreateView()メソッドのオーバーライドがない。
なので、onCreateView()って、nullを返すまま。

すなわち、Viewがないフラグメントって意味になる。

ダイアログ表示してることと矛盾。

でも、
ダイアログが表示されてるので、
仕掛けがあるはず。
そこに、上に表示させる仕掛けとかも・・。


ってことで、mDialogを見てみると、
onActivityCreated()で使われてるみたい。

ただ、ここは、どうも、
onCreatView()とonDialogView()の
どちらでも動くための仕掛け。
ってことで、ここに到達する前に、
mDialogに値を詰めるために、
onCreateDialog()が呼ばれてる。

そして、呼んでる箇所は、
getLayoutInflater()メソッド
(mDialogからたどれば、速かったかもしれないが・・)

ここが呼ばれるのは、
FragmentManagerの中。
ちょうどonCreateView()を呼ぶタイミング。
onCreateView()はnullを返すが、
そのための引数として、
getLayoutInflater()メソッドが呼ばれて、
onCreateDialog()に結びつくらしい。

ソースを読んでみて、
メソッドの正当性を持たすために、
結構無理した作りじゃないかといいたくなる。

そして、
getLayoutInflater()メソッドの中の
Windowのパラメータを設定してるあたりも、
ダイアログの為のある種の仕掛けなんだろうな。

使いやすくあるべきだけど、
新しいフラグメントに合わせるか、
今までのダイアログライクにするか、
葛藤でもあったのかな・・


リンク:
Android Developers
Developer Collaboration Project


|

« ABC2013秋に行ってきて。その2 | トップページ | 「陽だまりの彼女」を読んで »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/97274/53894773

この記事へのトラックバック一覧です: DialogFragmentって変な作り。。:

« ABC2013秋に行ってきて。その2 | トップページ | 「陽だまりの彼女」を読んで »