2011年9月11日日曜日

Android NumberPicker を拡張して ItemPicker を作ってみた。

Android には日時を設定するための DatePicker, 時刻を設定するための TimePicker が用意されています。これらの Picker の元になっているのが NumberPicker です。ちなみに NumberPicker は非公開クラスになっています。

この NumberPicker のレイアウトでは、 + ボタンが上にあるために、+ ボタンを押している間、設定している値が指で見えなくなってしまいます。そこで、この NumberPicker を元にして + ボタンと - ボタンが設定値の左右にある Picker を作ってみました。

ItemPicker at yanzm/yanzm-s-Custom-View-Project - GitHub



ついでに、ボタンと入力部分の画像リソースと、選択範囲および選択アイテムを attribute として指定できるようにしました。

こんな感じで、XML から値の設定などが全部できます。 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res/yanzm.products.customview.itempicker" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <DatePicker android:id="@+id/datePicker1" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TimePicker android:id="@+id/timePicker1" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <yanzm.products.customview.itempicker.ItemPicker android:layout_width="180dip" android:layout_height="wrap_content" android:focusable="true" android:focusableInTouchMode="true" android:text="+" custom:start="0" custom:end="10" custom:current="2" /> <yanzm.products.customview.itempicker.ItemPicker android:layout_width="240dip" android:layout_height="wrap_content" android:focusable="true" android:focusableInTouchMode="true" android:text="+" custom:start="1" custom:end="9" custom:current="2" custom:speed="100" custom:displayedValue="@array/color_names" /> <yanzm.products.customview.itempicker.ItemPicker android:layout_width="240dip" android:layout_height="wrap_content" android:focusable="true" android:focusableInTouchMode="true" android:text="+" custom:start="1" custom:end="9" custom:current="4" custom:incrementBackground="@drawable/picker_bg" custom:decrementBackground="@drawable/picker_bg" custom:editTextBackground="@drawable/input_bg" custom:displayedValue="@array/color_names" /> </LinearLayout>

attribute として用意したのは
  • incrementSrc : 増加ボタン (ImageButton) の 画像リソース
  • decrementSrc : 減少ボタン (ImageButton) の画像リソース
  • incrementBackground : 増加ボタン (ImageButton) の 背景画像リソース
  • decrementBackground : 減少ボタン (ImageButton) の背景画像リソース
  • editTextBackground : 設定値 (EditText) の背景画像リソース
  • start : 最少値 (int)
  • end : 最大値 (int)
  • current : 現在の値 (int)
  • speed : ボタン長押し時の自動増加/減少の切り替え速度
  • displayedValue : 数字ではなく文字を設定値にする場合の文字列配列。最小値が index 0 にあたる


0 件のコメント:

コメントを投稿