くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Androidでカスタムビュー: NumberPickerのmin/maxをxmlで設定できるようにする

Androidの開発をしてて、NumberPickerのmin/maxをXMLで指定したいなと思って、いろいろ調べた備忘録。
カスタムビューにすればできるらしい(´ω`)

設定できる属性を定義する(attrs.xml)

まずは、xmlで使える属性を設定する。
res/values/attrs.xmlに設定を書くらしい。

<!- res/values/attrs.xml ->
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <declare-styleable name="CustomNumberPicker">
    <attr name="min" format="integer" />
    <attr name="max" format="integer" />
  </declare-styleable>
</resources>

カスタムしたNumberPicker

次にNumberPickerを継承したクラスを用意。
各コンストラクタに、初期化処理(initView)を追加しておく。

public class CustomNumberPicker extends NumberPicker {

  public CustomNumberPicker(Context context) {
      super(context);
  }

  public StepNumberPicker(Context context, AttributeSet attrs) {
    super(context, attrs);

    // 初期化処理を追加
    initView(context, attrs, 0);
  }

  public StepNumberPicker(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);

    // 初期化処理を追加
    initView(context, attrs, defStyleAttr);
  }

  // 初期化処理
  private void initView(Context context, AttributeSet attrs, int defStyleAttr) {
    // 属性の一覧を取得
    Resources.Theme theme = context.getTheme();
    int[] style = R.styleable.CustomNumberPicker;
    TypedArray typedArray = theme.obtainStyledAttributes(attrs, style, defStyleAttr, 0);

    try {
        // 属性min/maxの値を取得
        int min = typedArray.getInteger(R.styleable.CustomNumberPicker_min, 0);
        int max = typedArray.getInteger(R.styleable.CustomNumberPicker_max, 0);
        
        // 取得したmin/maxの値を設定する
        super.setMinValue(min);
        super.setMaxValue(max);
    } finally {
        typedArray.recycle();
    }
  }
}

CustomNumberPickerを使う

自分で定義した属性を使う場合は、
xmlns:custom="http://schemas.android.com/apk/res-auto"を追加して、
custom:maxで設定する感じ。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:custom="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="match_parent" >

  <com.example.CustomNumberPicker
    android:id="@+id/spinner_min1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    custom:max="100"
    custom:min="0" />

</LinearLayout>

以上! 簡単(´ω`)

参考にしたサイトさま