見返すかもしれないメモスマートフォン用の表示で見る見返すかもしれないメモ2016-02-14AndroidでDatePickerDialogのまがい物を作るAndroid2日かけて、AndroidのDatePickerDialogのまがい物を作った。名前被らないように、DateSelectDialogって名前にした。何で作ろうと思ったかというと、標準のDatePickerDialogでは「年だけ選択させる」とか「年と月だけ選択させる」っていうのができないから。それを実現しようと思うと、yukiasu.blogspot.jpこの方のような方法をとることになる。昔のUIだったらこれでいけたんだけど、最近のDatePickerDialogは下の画像のようにすごい複雑化してるので、ただ単に「日付選択のViewだけ非表示にする」っていうのではうまくいかなさそう。今では非推奨となってしまったHOLOテーマを指定する手もあるけど、マテリアルデザインが好きなので戻りたくない...。そこで、もう自分でまがい物を作ればいいんちゃうかなって思った。現在の年選択ダイアログがこんなん。この上半分を消して、年選択の右側に月選択と日選択のスピナーを表示させたらいいんかな?年選択はListViewで実装されてるっぽいので、それに倣ってやってみる。完成図は下のような感じ。android:id="@+id/date"/></LinearLayout>weightを1にして、均等に並べる。android:id="@+id/text"/></RelativeLayout>ImageViewは背景の丸で、TextViewは「2016」とかの文字。Calendar.YEARを指定することでどこまで選択させるかを決め、"default"で初期値を入れることにする。いう情報はgetArguments()から取ってくる。ダイアログクラスのonCreateDialogは下のようになった。dialog;}Dialogの中身のListViewのアダプタまず、日付を変換する必要があったので、いろいろメソッドを用意した。この辺で使う数字には3タイプある。リストでのポジション(0インデックス)普通に1から始まる(年は1970からだけど)表示用の数字カレンダーにセットするとき用の数字(日付・年は表示用のままでいいのに、月だけは0インデックス)それらを互いに変換しようと思うと、下のようになった。効率のいい方法あったかも...。}}ここからが一番ややこしかった。リストの一番上と一番下に空白を追加するところが厄介だった。空白を入れないと、こんな感じで、フォーカスされてる日付を真ん中に持ってこようとしても限界がある。空白を加えて下のようにする。2」なんだけど、ListView全体の高さっていうのがgetViewに来てからでないと求まらんかった。DialogFragmentの方のonCreateDialogとかonCreateViewとかでは、0が返ってきたりListView自体がnullだったりする。わからないことに、ログ出力してみたらgetViewがすごい回数呼ばれてて、初めのうちはListViewの高さは0なのに、途中からちゃんとした数字になっていくみたいだった。}}setSelectionFromTopやりすぎって思ったけど、一回セットしただけでは元に戻ってしまったので何回もやってる。クリックリスナーでは、標準のDatePickerDialogと同じように、クリックされた際に短くバイブさせる。それがperformHapticFeedbackっていうメソッドなんだけど、ここでは引数であるfeedbackConstantにHapticFeedbackConstants.LONG_PRESSを指定してる。本当はCLOCK_TICKがよかったんだけど、APIレベルが足りないので仕方なく...。CLOCK_TICKが「ビッ」って感じだとすると、LONG_PRESSは「ズォンッ」って勢いでバイブレートしよる。クリックが遅れて反応する問題たまに、リストの中身をクリックしたら反応が遅れることがあった。stackoverflow.comここの、LayoutParamsについて語ってる人の回答を見て解決!convertViewに毎回新しく作ったLayoutParamsをセットしてたのが原因だった。○;こうやって設定すればよかったみたい。onDateSelectedListener;setOnDateSelectedListenerが呼び出されたときに登録する。l;}そしたら、さっき「あとで書く」って書いたOKボタンのリスナーには下のように書ける。}});いろいろと効率悪いところもあるけど、これで上に貼った完成図のようなダイアログができた(*‘▽’)横向けてもちゃんと表示されてる。(1)Searchはてなブログをはじめよう!YaaMaaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。