Androidで、10,20,30のように選択できるnumberpickerを利用したいです。調べたところ標準では単位の変更は出来ないとの事なのでカスタムされたものを使おうと考えています。
そこで、http://dev.classmethod.jp/smartphone/increment-minutes-custom-timepicker-01/のサイトに乗っているプロジェクトを使用し、既存のプロジェクトに組み込んでみたのですが、やり方が違うのかうまく動作しません。
既存のプロジェクトにサイトのプロジェクトをimport moduleして、使いたい場所のxmlに記述、javaの方にも動作を記述して実行させると、まるで既存のプロジェクトが存在していないかのように、サイトのアプリのみが動きます。
外部からプロジェクトを参照して特定の場所でカスタマイズされたものを使うのは無理なのでしょうか?
長文でわかりにくいかもしれませんが、よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
ベストアンサー
恐らくサンプルも一緒にimportしてしまっていると思われます。
GitHubからzip形式でダウンロードすると、大まかに以下のような構成になっていると思います。
AndroidComponentLibrary-master
│
├ ComponentLibrary
│
└ SampleComponent
Import Moduleする際にAndroidComponentLibrary-masterを選ばれませんでしたか?
サンプルは必要ないので、図のようにImportのチェックを外してください。
もしくは、Source directoryにAndroidComponentLibrary-master\ComponentLibraryを指定してください。
-追記-
カスタムNumberPickerの作り方
まず、res/valuesにxmlファイルを追加します。
ファイル名は「attr.xml」などとします。
これにより、レイアウトファイルで指定するパラメータを定義します。
xml
1<?xml version="1.0" encoding="utf-8"?> 2<resources> 3 <declare-styleable name="CustomNumberPicker"> 4 <attr name="step" format="integer" /> 5 <attr name="min" format="integer" /> 6 <attr name="max" format="integer" /> 7 </declare-styleable> 8</resources>
続いてJava Classを追加します。
名前はxmlで指定したものと同じ「CustomNumberPicker」で、
SuperclassとしてNumberPickerを指定します。
Java
1package xxx; 2 3import android.content.Context; 4import android.content.res.TypedArray; 5import android.support.v7.widget.AppCompatEditText; 6import android.util.AttributeSet; 7import android.view.View; 8import android.view.ViewGroup; 9import android.widget.NumberPicker; 10 11/** 12 * Created by massa on 2016/11/15. 13 */ 14 15public class CustomNumberPicker extends NumberPicker { 16 17 // 表示用の値のリスト 18 private String [] mValueSet; 19 20 // 最大値・最小値 21 private int mMaxValue; 22 private int mMinValue; 23 24 // 刻み幅 25 private int mStep; 26 27 public CustomNumberPicker(Context context) { 28 super(context); 29 } 30 31 public CustomNumberPicker(Context context, AttributeSet attrs) { 32 super(context, attrs); 33 initialize(context, attrs); 34 } 35 36 public CustomNumberPicker(Context context, AttributeSet attrs, int defStyleAttr) { 37 super(context, attrs, defStyleAttr); 38 initialize(context, attrs); 39 } 40 41 private void initialize(Context context, AttributeSet attrs) { 42 if (this.isInEditMode()) { 43 return; 44 } 45 46 // レイアウトで指定された値の取得 47 TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomNumberPicker, 0, 0); 48 try { 49 mStep = typedArray.getInteger(R.styleable.CustomNumberPicker_step, 1); 50 mMinValue = typedArray.getInteger(R.styleable.CustomNumberPicker_min, 0); 51 mMaxValue = typedArray.getInteger(R.styleable.CustomNumberPicker_max, mMinValue); 52 } 53 finally { 54 typedArray.recycle(); 55 } 56 57 setValues(); 58 } 59 60 private void setValues() { 61 int value_num = 0; 62 63 // minとmaxが逆だったら入れ替える 64 if (mMinValue > mMaxValue) { 65 int temp = mMinValue; 66 mMinValue = mMaxValue; 67 mMaxValue = temp; 68 } 69 70 // min ~ maxに値がいくつ入るか算出 71 value_num = (mMaxValue - mMinValue + mStep - 1) / mStep; 72 73 mValueSet = new String[value_num + 1]; 74 75 // 表示値のリストを作る 76 for (int i = 0; i < value_num; i++) { 77 mValueSet[i] = String.valueOf(mMinValue + mStep * i); 78 } 79 mValueSet[value_num] = String.valueOf(mMaxValue); 80 81 // 表示値の数が変わるので、一旦初期化 82 super.setMaxValue(0); 83 84 setDisplayedValues(mValueSet); 85 86 // 本来のValueはindexとして使用する 87 super.setMinValue(0); 88 super.setMaxValue(value_num); 89 90 // 一旦最大値を設定 91 super.setValue(value_num); 92 93 for (int i = 0; i < getChildCount(); i++) { 94 View view = getChildAt(i); 95 if (view.getClass().equals(AppCompatEditText.class) == true) { 96 // Text部分のサイズを計算 97 int expandSpec = MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK, MeasureSpec.AT_MOST); 98 view.measure(expandSpec, expandSpec); 99 100 // Text部分の幅を設定 101 ViewGroup.LayoutParams params = view.getLayoutParams(); 102 params.width = view.getMeasuredWidth(); 103 } 104 } 105 106 // 初期表示のindex 107 super.setValue(0); 108 } 109 110 @Override 111 public int getValue() { 112 // setDisplayedValuesでも使用しているので、ここに変更は加えない 113 return super.getValue(); 114 } 115 116 @Override 117 public void setValue(int value) { 118 // スクロール時に使用されているので、ここに変更は加えない 119 super.setValue(value); 120 } 121 122 public int getDisplayedValue() { 123 // 選択されている値を取得するときは、こちらを呼び出す 124 int pos = super.getValue(); 125 return Integer.parseInt(mValueSet[pos]); 126 } 127 128 @Override 129 public void setDisplayedValue(int value) { 130 // プログラム中から表示値の設定をするときは、こちらを呼び出す 131 int pos = 0; 132 while (value > Integer.parseInt(mValueSet[pos])) { 133 pos++; 134 } 135 super.setValue(pos); 136 } 137 138 @Override 139 public int getMinValue() { 140 return mMinValue; 141 } 142 143 @Override 144 public void setMinValue(int minValue) { 145 mMinValue = minValue; 146 setValues(); 147 } 148 149 @Override 150 public int getMaxValue() { 151 return mMaxValue; 152 } 153 154 @Override 155 public void setMaxValue(int maxValue) { 156 mMaxValue = maxValue; 157 setValues(); 158 } 159}
後は、レイアウトファイルから以下のように使用できると思います。
xml
1 <xxx.CustomNumberPicker 2 xmlns:custom="http://schemas.android.com/apk/res-auto" 3 android:layout_width="wrap_content" 4 android:layout_height="wrap_content" 5 custom:step="5" 6 custom:min="10" 7 custom:max="100" 8 android:id="@+id/numberPicker"/>
選択されている値は、以下のように取得できます。
Java
1CustomNumberPicker customNumberPicker = (CustomNumberPicker)findViewById(R.id.numberPicker); 2 3int value = customNumberPicker.getDisplayedValue();
当初、getValue()をオーバーライドしてみたのですが、
setDisplayedValuesの中から呼び出されているようで、表示される値がおかしくなってしまいました。
なので、getValue()はいじらず、getDisplayedValue()というメソッドを追加しています。
パッケージ名はxxxとしているので、適宜変更してください。
色々なケースを試せてないので、問題あればご指摘ください。
投稿2016/11/14 05:21
編集2016/11/30 09:23総合スコア161
0
Androidで、10,20,30のように選択できるnumberpicker
標準では単位の変更は出来ないとの事なので
NumberPickerをこの場合2つ並べれば簡単にできると思います
java
1NumberPicker numPicker0 = (NumberPicker)findViewById(R.id.numPicker0); 2NumberPicker numPicker1 = (NumberPicker)findViewById(R.id.numPicker1); 3 4 5numPicker0.setMaxValue(3); 6numPicker0.setMinValue(1); 7 8numPicker1.setMaxValue(0); 9numPicker1.setMinValue(0);
numPicker0は1,2,3
numPicker1は0固定
これでnumPicker0だけをユーザーが動かせばできるでしょう
参考:
https://akira-watson.com/android/numberpicker.html
投稿2016/11/14 06:01
総合スコア3733
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/14 06:01
2016/11/14 10:27
2016/11/15 05:59
2016/11/17 07:33
2016/11/29 06:30
2016/11/30 09:30