Android+Kotlinでカスタムビューを定義する正しい手順/コード例

Android Studio + Kotlinでカスタムビューを作りたい。

滅多にないけど既存ビューで不足だったり、
どうしても必要になってしまう場面はあります。

今回はKotlinでこんなビューを定義したかったです。

▼ ゴールはミリ秒まで取得できるTimePicker作成

  • 時間を設定・取得できるTimePicker
  • ただしミリ秒精度まで設定できる
  • 時間/分/秒/ミリ秒を個別に設定可能
  • カスタムレイアウト(XML)を使いたい

▼ 最終的なSmartTimePickerの見た目

このカスタムビューを例にしながら、
Kotlinでのカスタムビューの定義手順を解説します。

0.今回作成するカスタムビューの概要とか

名前は SmartTimePicker と名付けました。

これは次のパッケージ名を持ちます。

com.hoge.myapp.SmartTimePicker

このパッケージ名は各自で変わるので注意

そして冒頭で書いたように次の特長を持ちます。

  • ミリ秒精度で時間を設定できる
  • ミリ秒単位で時間を取得できる
  • UI的には 時間/分/秒/ミリ秒 という並び

既存のTimePickerを使おうと思ったけど、それだと秒単位まで指定できない…なんならミリ秒精度まで必要なのにそれだと不便すぎました。

だから思い切ってカスタムビュークラスを定義し、レイアウトもカスタムレイアウト(XML)から作って独自ビュー作成しようと考えました。

動機としてはそんなところです。

1,カスタムビューのlayoutXMLを定義しよう

初めにカスタムビューのlayoutから定義します。

名前 : custom_layout_smart_time_picker.xml

▼ 以下がそのレイアウトXMLの内容

このビューは 時間/分/秒/ミリ秒 が個別指定可能。
具体的にはNumberPickerで指定できるUIにしました。

あと地味に重要なのがルートビューをmergeタグを使って定義してることです。そうすることでレイアウト的な冗長性がなくなります。(パフォーマンス向上)

さすがにAndroid Studioでのレイアウト作成の手順は解説しません。カスタムビューを作ろうと考えられるレベルなら、そんな解説は不要なはずです。

レイアウトはこんな感じです。

2.カスタムビュークラスを拡張・作成する

お次はカスタムビュークラスの作成です。

ここではConstraintLayoutを拡張します。

▼ カスタムビュークラス : SmartTimePicker.kt

やってることは至って単純です。

先ほど定義したレイアウトXMLから View.inflate(context, [レイアウトID], this)  みたいにレイアウトを膨らませ、あとは各ビューに値を設定してるだけです。

3.カスタムビューをレイアウト上に設置

あとはActivityのレイアウト上に設置

普通にカスタムビューのタグを書くだけです。

▼ ConstraintLayout内にカスタムビュー設置例

あとは普通のビューと同じように扱えます。

カスタムビュー(SmartTimePicker)の動作例

これでカスタムビュー(SmartTimePiacker)の完成です。

こんな見た目と動作になりました。

▼ SmartTimePicker表示時の見た目

カスタムビュー(SmartTimePicker)の見た目。ミリ秒単位まで時間を選択指定できるタイムピッカー

▼ SmartTimePickerを動かしてる様子(Gif)

作成したカスタムビュー(SmartTimePicker)を動かしてる様子のGif動画。個別に時間・分・秒・ミリ秒がセットできる

ほぼ思い通りの仕上がりになりました。

カスタムビューの作成はそんなに難しくない

以上、Android Kotlinでのカスタムビューの作り方でした。

基本手順を踏めば、どんなカスタムビューでも作れます。