2016-06-26 9 views
1

Number in xml:Wie Call Number Picker onvaluechange Methode von Button onclick?

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

Und hier ist Button:

<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 auf Number:

//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... 

     } 
    }); 

Wenn Benutzer den Wert ändert, in onvaluechange die Anweisungen ausführen, wie sie sollten . Aber ich möchte den Wert der Zahlenauswahl mit einem Knopf aktualisieren.

Jetzt habe ich eine OnClickListener auf Taste eingestellt:

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); 
     } 
    }); 

Dies funktioniert, es erhöht den Wert der Anzahl Picker von 1, aber es keine Benachrichtigung der Number, dass der Wert, um ein Ergebnis verändert hat , der Code innerhalb onValueChange() wird nicht ausgeführt. Nur wenn der Benutzer den Nummernwähler manuell scrollt, werden die Anweisungen ausgeführt. Ich möchte das Gleiche passieren, wenn die Schaltfläche geklickt wird.

Antwort

1

Dies ist eigentlich ein korrektes Verhalten von NumberPicker Widget einzustellen. Wenn Sie in den Quellcode schauen, werden Sie sehen:

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

und hier ist setValueInternal Methode:

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(); 
} 

wie Sie setValueInternal sehen können setValue Methode mit NotifyChange = false aufgerufen wird und deshalb wird Ihr Listener nicht benachrichtigt. setValueInternal wird als privat deklariert, so dass Sie es nicht aus Ihrem Code heraus aufrufen können, ohne eine Reflektion zu verwenden.

ist mein Vorschlag, so etwas zu tun:

private class NumberPickerListener implements NumberPicker.OnValueChangeListener { 

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

dann erklären nur eine NumberPickerListener Variable und verwenden Sie es in Ihrem Klick-Listener:

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

Haben Sie eine separate Variable für Zuhörer

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

      //Statement goes here... 

     } 
    } 

Wie

numberPicker.setOnValueChangedListener(np_listener); 

Nutzungs

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 
    } 
});