質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

3回答

6261閲覧

Android numberpicker カスタム

xasax0404

総合スコア27

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2016/11/14 01:09

Androidで、10,20,30のように選択できるnumberpickerを利用したいです。調べたところ標準では単位の変更は出来ないとの事なのでカスタムされたものを使おうと考えています。
そこで、http://dev.classmethod.jp/smartphone/increment-minutes-custom-timepicker-01/のサイトに乗っているプロジェクトを使用し、既存のプロジェクトに組み込んでみたのですが、やり方が違うのかうまく動作しません。
既存のプロジェクトにサイトのプロジェクトをimport moduleして、使いたい場所のxmlに記述、javaの方にも動作を記述して実行させると、まるで既存のプロジェクトが存在していないかのように、サイトのアプリのみが動きます。
外部からプロジェクトを参照して特定の場所でカスタマイズされたものを使うのは無理なのでしょうか?
長文でわかりにくいかもしれませんが、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
Kmassa

総合スコア161

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kmassa

2016/11/14 06:01

ところで、このライブラリにあるのはカスタムTimePickerだけのようですが、 利用したいのはNumberPickerですよね? そのあたりは問題ないでしょうか?
xasax0404

2016/11/14 10:27

サイトにあるピッカーのように、5,10,15のように指定出来れば、その派生で10,20,30と出来ると考えてこのプロジェクトを利用しようとしてますが、timepickerはnumberpickerのように利用する事は出来ないのでしょうか?
Kmassa

2016/11/15 05:59

TimePickerはあくまでも時刻を入力するためのインターフェイスなので、 時、分の2つのNumberPickerが表示されてしまいます。 また、値の範囲も0~23と0~59になってしまいます。 NumberPickerを基にカスタムViewを作成したほうが良いかと思われます。 試しに作ってみたので、最初の回答に追記しました。
xasax0404

2016/11/17 07:33

自分の求めていたとおりの動作しました! ほんとに感謝しています。
xasax0404

2016/11/29 06:30

すいません、解決した報告したものを再度質問するのはよろしくないんですが、聞いて下さい。 様々な端末でこのカスタムピッカーを使用しましたが、apiが15以下だとうまく動作しないみたいです。解決策わかりますでしょうか?
Kmassa

2016/11/30 09:30

遅くなりましたが、修正してみました。 (1) initialize レイアウトが表示されなくなっていたので、編集時にはそれ以降の処理を行わないようにしました。 (2) setValues API16以降(?)では数字の部分の幅が自動的に調整されるようですが、 API15のADBで確認したところ、はみ出してしまっていたので調整するようにしました。 (3) setValue、setDisplayedValue API15以前ではスクロール時にsetValueが呼ばれているようで、 ここをカスタマイズしていたためスクロールがうまくできなくなっていました。 なので、setValueはIndexを指定するメソッド、setDisplayedValueは表示値を設定するメソッドという形にしました。
guest

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

aja

総合スコア3733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xasax0404

2016/11/14 10:21

すみません。そのような方法も検討しましたが、100以上も考えてますので今回は辞めたんです。説明不足ですみませんでした。
swordone

2016/11/14 13:43

100以上でもnumberPicker0の上限を10以上にすればいいのでは?
aja

2016/11/14 15:43

100以上とは? 110... 250...3660, というようなpickerでしょうか [1][1][0]と3つ、4つと桁を増やして並べれば済むのでは あるいは何か他に理由があるのでしょう
guest

0

マニフェストファイルもコピーしましたか?
起動Activityがサンプルのものになっているのかも知れませんね。
マニフェストファイルを追記してください。

投稿2016/11/14 03:37

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問