Here is the code, the months are updated perfectly, but with a leap some kind of trouble:

package game.life.ru.basicviews; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.NumberPicker; public class MainActivity extends AppCompatActivity { public NumberPicker yearChoose = null ; public NumberPicker monthChoose = null ; public int maxDay = 31; public int maxYear = 2216; public int minYear = 1940; public int maxMonth = 12; public int minMonth = 1; public int minDay = 1; public int yearChoseInt; public int monthChoseInt = 0; public int modif = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); NumberPicker numberPicker3 = (NumberPicker) findViewById(R.id.numberPicker3); numberPicker3.setMaxValue(maxYear); numberPicker3.setMinValue(minYear); numberPicker3.setValue(1990); yearChoseInt = numberPicker3.getValue();//получаем значение года NumberPicker numberPicker2 = (NumberPicker) findViewById(R.id.numberPicker2); numberPicker2.setMaxValue(maxMonth); numberPicker2.setMinValue(minMonth); numberPicker2.setValue(1); NumberPicker numberPicker = (NumberPicker) findViewById(R.id.numberPicker); numberPicker.setMaxValue(maxDay); numberPicker.setMinValue(minDay); numberPicker.setValue(1); yearChoose = (NumberPicker)findViewById(R.id.numberPicker3);//проверяем изменение года yearChoose.setOnValueChangedListener(new NumberPicker.OnValueChangeListener(){//перегрузка после изменения значения года @Override public void onValueChange(NumberPicker numberPicker3,int minYear, int yearChoseInt){ if(yearChoseInt%4==0 && yearChoseInt%100 !=0 || yearChoseInt%400==0){ //проверка высокосности года modif = 1; } else { modif = 0; } NumberPicker numberPicker2 = (NumberPicker) findViewById(R.id.numberPicker2); monthChoseInt = numberPicker2.getValue();//получаем значение месяца monthChoose = (NumberPicker)findViewById(R.id.numberPicker2);//проверяем что за значение введено monthChoose.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {//проверка на изменение значения и запуск перегрузки @Override public void onValueChange(NumberPicker numberPicker2,int minMonth, int monthChoseInt) { switch (monthChoseInt) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: maxDay = 31; break; case 4: case 6: case 9: case 11: maxDay = 30; break; default: maxDay = 28 + modif; } NumberPicker numberPicker = (NumberPicker) findViewById(R.id.numberPicker); numberPicker.setMaxValue(maxDay); numberPicker.setMinValue(minDay); } }); } }); } } 
  • You need to kick the month change event inside the year change event - after calling monthChoose.setOnValueChangedListener , or put the logic ... numberPicker.setMaxValue(maxDay); in a separate method and call it in both places. - Igor
  • Maybe better to use the standard datepicker? - iramm

1 answer 1

If we take out the method of changing the month separately and call it when the year and month change, then there will be something like this:

 public class MainActivity extends AppCompatActivity { public NumberPicker yearChoose = null ; public NumberPicker monthChoose = null ; public int maxDay = 31; public int maxYear = 2216; public int minYear = 1940; public int maxMonth = 12; public int minMonth = 1; public int minDay = 1; public int yearChoseInt; public int monthChoseInt = 0; public int modif = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); NumberPicker numberPicker3 = (NumberPicker) findViewById(R.id.numberPicker3); numberPicker3.setMaxValue(maxYear); numberPicker3.setMinValue(minYear); numberPicker3.setValue(1990); yearChoseInt = numberPicker3.getValue();//получаем значение года NumberPicker numberPicker2 = (NumberPicker) findViewById(R.id.numberPicker2); numberPicker2.setMaxValue(maxMonth); numberPicker2.setMinValue(minMonth); numberPicker2.setValue(1); NumberPicker numberPicker = (NumberPicker) findViewById(R.id.numberPicker); numberPicker.setMaxValue(maxDay); numberPicker.setMinValue(minDay); numberPicker.setValue(1); yearChoose = (NumberPicker)findViewById(R.id.numberPicker3);//проверяем изменение года yearChoose.setOnValueChangedListener(new NumberPicker.OnValueChangeListener(){//перегрузка после изменения значения года @Override public void onValueChange(NumberPicker numberPicker3,int minYear, int yearChoseInt){ if(yearChoseInt%4==0 && yearChoseInt%100 !=0 || yearChoseInt%400==0){ //проверка высокосности года modif = 1; } else { modif = 0; } changeData(monthChoseInt); } }); monthChoseInt = numberPicker2.getValue();//получаем значение месяца monthChoose = (NumberPicker)findViewById(R.id.numberPicker2);//проверяем что за значение введено monthChoose.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {//проверка на изменение значения и запуск перегрузки @Override public void onValueChange(NumberPicker numberPicker2,int minMonth, int monthChoseInt) { changeData(monthChoseInt); } }); } private void changeData(int monthChoose){ monthChoseInt = monthChoose; switch (monthChoose) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: maxDay = 31; break; case 4: case 6: case 9: case 11: maxDay = 30; break; default: maxDay = 28 + modif; } NumberPicker numberPicker = (NumberPicker) findViewById(R.id.numberPicker); numberPicker.setMaxValue(maxDay); numberPicker.setMinValue(minDay); } }