4

activity_main.xml

<NumberPicker
        android:id="@+id/numberPicker1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView2"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="30dp" />

の中MainActivity.javaoncreate

NumberPicker numberPicker1 = (NumberPicker) findViewById(R.id.numberPicker1);
numberPicker1.setMinValue(1);
numberPicker1.setMaxValue(20);

キーボードで値を編集すると、プログラムで取得した値は変更されませんが、押す+-機能します。

+とを押さずに動作させるにはどうすればよい-ですか?


編集 :

Melih Altıntaş のコードで新しいプロジェクトを作成したところ、まったく新しいナンバーピッカーが表示されました!! (指でスライドして文字入力ができないもの)。次に、実際のプロジェクトと比較したところ、android:theme="@android:style/Theme.NoTitleBar". 新しいプロジェクトに追加したところ、numberpicker は慣れ親しんだものになりました。

4

6 に答える 6

20

簡単な回避策が必要な場合は、値を保存する前に以下のコードを追加してください。

numberPicker.clearFocus();
于 2014-03-21T13:29:45.907 に答える
9

NumberPicker、そのインタラクション用に設計されていません。キーボードで値を変更すると、 からウィジェットに直接変更が加えられNumberPicker、ウィジェット自体はこの変更を認識しないため、最後に保存された値になってしまいます。これを回避するには、基になるコードにアクセスする必要があるため、実際にはお勧めしませんEditText(電話メーカーが最初にこれを変更していないと仮定して)いくつかのハック コードが必要になります。

private EditText findInput(ViewGroup np) {
    int count = np.getChildCount();
    for (int i = 0; i < count; i++) {
        final View child = np.getChildAt(i);
        if (child instanceof ViewGroup) {
            findInput((ViewGroup) child);
        } else if (child instanceof EditText) {
            return (EditText) child;
        }
    }
    return null;
}

次に、このコードを使用しTextWatcherて、見つかったものに を設定し、EditText手動で変更されたときを確認します (そして、NumberPickerこの変更について知らせます)。

EditText input = findInput(np);    
TextWatcher tw = new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {}

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {}

        @Override
        public void afterTextChanged(Editable s) {
                if (s.toString().length() != 0) {
                    Integer value = Integer.parseInt(s.toString());
                    if (value >= np.getMinValue()) {
                        np.setValue(value);
                    }
                }
        }
    };
input.addTextChangedListener(tw);

もう 1 つのオプションは、NumberPickerウィジェットの独自の実装を作成し、対象とする機能を挿入することです。

于 2013-09-24T17:00:06.303 に答える
2

あなたはすでに答えを持っているようですが、これは他の人にとって役立つかもしれません。android.widget.NumberPicker を拡張して、EditText を構成できる場所を独自に作成できます。ソフト キーボードで入力すると、NumberPicker の値が入力中の値にすぐに設定されます。

public class MyNumberPicker extends android.widget.NumberPicker {

       private EditText eText;

       public MyNumberPicker(Context context, AttributeSet attrs) {
        super(context, attrs);
       }


       @Override
       public void addView(View child) {
         super.addView(child);
         initEditText(child);
       }

       @Override
       public void addView(View child, int index, android.view.ViewGroup.LayoutParams params) {
         super.addView(child, index, params);
         initEditText(child);
       }

       @Override
       public void addView(View child, android.view.ViewGroup.LayoutParams params) {
         super.addView(child, params);
         initEditText(child);
       }

       public void initEditText(View view){
           if(view instanceof EditText){
               EditText eText = (EditText) view;
               eText.addTextChangedListener(new TextWatcher(){

                @Override
                public void afterTextChanged(Editable arg0) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void beforeTextChanged(CharSequence arg0, int arg1,
                        int arg2, int arg3) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    try{
                        int num = Integer.parseInt(s.toString());
                        setValue(num); //this line changes the value of your numberpicker
                    }catch(NumberFormatException E){
                            //do your catching here
                    }   
                }});     
             }
          }
     }

XML ファイルに次のように記述します。

<com.mypackage.MyNumberPicker
 android:id="@+id/numberPicker1"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content" />
于 2014-04-02T09:25:18.550 に答える
1
NumberPicker np = (NumberPicker) findViewById(R.id.numberPicker1);
String[] nums = new String[20];
for(int i=0; i<nums.length; i++)
       nums[i] = Integer.toString(i);

np.setMinValue(1);
np.setMaxValue(20);
np.setWrapSelectorWheel(false);
np.setDisplayedValues(nums);
np.setValue(1);
于 2013-09-22T14:54:20.620 に答える