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>
以上! 簡単(´ω`)