2016-06-26 9 views
1

NumberPicker:番号選択ツールonvaluechangeメソッドをボタンonclickから呼び出す方法は? XMLで

<NumberPicker 
     android:id="@+id/np" 
     android:layout_width="wrap_content" 
     android:layout_height="100dp" 
     android:layout_weight="1" /> 

そして、ここではボタンです:

<Button 
    android:id="@+id/button" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_horizontal" 
    android:padding="30dp" 
    android:text="Any text!" 
    android:background="@drawable/round_button" /> 

OnValueChangedListener numberpicker上:

//Set a value change listener for NumberPicker 
    numberPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { 
     @Override 
     public void onValueChange(NumberPicker picker, int oldVal, int newVal){ 

      //Statement goes here... 

     } 
    }); 

ユーザーが値を変更するたびに、彼らが必要のように、onvaluechange内の文を実行。しかし、ボタンを使用して数値ピッカーの値を更新したいと思います。

さて、私はボタンにonclicklistenerを設定しています

b1 = (Button) rootView.findViewById(R.id.button); 
    b1.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      //Increment NumberPicker value by 1 
      numberPicker.setValue(numberPicker.getValue() + 1); 
     } 
    }); 

これは動作しますが、それが1で番号ピッカーの値をインクリメントしますが、それは価値が結果としてので、変更されたことをnumberpickerに通知していませんonValueChange()のコードは実行されません。ユーザーが手動で数値ピッカーをスクロールする場合にのみ、ステートメントが実行されます。ボタンをクリックすると同じことが起こりたい。

答えて

1

を設定するにはどのようにリスナー

NumberPicker.OnValueChangeListener np_listener = new NumberPicker.OnValueChangeListener() { 
     @Override 
     public void onValueChange(NumberPicker picker, int oldVal, int newVal){ 

      //Statement goes here... 

     } 
    } 

用に別の変数を持っています。 あなたは、そのソースコードの中を見ると、あなたがこの表示されます。あなたはsetValueInternalnotifyChange = falseをsetValueメソッドによって呼び出され見ることができるよう

private void setValueInternal(int current, boolean notifyChange) { 
    if (mValue == current) { 
     return; 
    } 
    // Wrap around the values if we go past the start or end 
    if (mWrapSelectorWheel) { 
     current = getWrappedSelectorIndex(current); 
    } else { 
     current = Math.max(current, mMinValue); 
     current = Math.min(current, mMaxValue); 
    } 
    int previous = mValue; 
    mValue = current; 
    updateInputTextView(); 
    if (notifyChange) { 
     notifyChange(previous, current); 
    } 
    initializeSelectorWheelIndices(); 
    invalidate(); 
} 

public void setValue(int value) { 
    setValueInternal(value, false); 
} 

、ここではsetValueInternal方法ですこれがリスナーに通知されない理由です。 setValueInternalはプライベートとして宣言されているため、リフレクションを使用せずにコードから呼び出すことはできません。

private class NumberPickerListener implements NumberPicker.OnValueChangeListener { 

    @Override 
    public void onValueChange(NumberPicker picker, int oldVal, int newVal) { 
     //your code 
    } 
} 

そしてちょうどNumberPickerListener変数を宣言して、クリックリスナーの内側にそれを使用します:

final NumberPickerListener numberListener = new NumberPickerListener(); 
numberPicker.setOnValueChangedListener(numberListener); 

b1.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     int oldValue = numberPicker.getValue(); 
     numberPicker.setValue(oldValue + 1); 
     numberListener.onValueChange(numberPicker, oldValue, oldValue+1); 
    } 
}); 

私の提案は、このような何かを行うことです

2

は、これは実際NumberPickerウィジェットの正常な動作です

numberPicker.setOnValueChangedListener(np_listener); 

使用

b1 = (Button) rootView.findViewById(R.id.button); 
b1.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     //Increment NumberPicker value by 1 
     numberPicker.setValue(numberPicker.getValue() + 1); 
     // use it here np_listener 
    } 
}); 
関連する問題