有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将两个数字选择器的值设置为倒计时计时器的小时和分钟

我现在有两个数字选择器。一个用于设置小时值,另一个用于设置倒计时计时器的分钟值。现在发生的是倒计时计时器的值,或者是小时数选择器的值,或者是分钟数选择器的值,但决不能两者都是它应该的值。所以我的问题是如何将倒计时计时器的文本视图更改为小时数和分钟数选择器值。如果你有问题要问,这可能有点让人困惑。 这是我的密码

public class MainActivity extends AppCompatActivity {
NumberPicker noPickerHours;
NumberPicker noPickerMinutes;
TextView textViewTime;
Button button;
CounterClass timer;
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    textViewTime = (TextView) findViewById(R.id.textView);

    noPickerMinutes = (NumberPicker) findViewById(R.id.numberPicker2);
    noPickerMinutes.setMaxValue(59);
    noPickerMinutes.setMinValue(0);
    noPickerHours = (NumberPicker) findViewById(R.id.numberPicker);
    noPickerHours.setMaxValue(24);
    noPickerHours.setMinValue(0);
    button = (Button)findViewById(R.id.button);



    button.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            timer.start();
        }
    });

    noPickerHours.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {


        @Override
        public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
            timer = new CounterClass((newVal * 60 * 1000), 1000);
            long millis = (newVal * 60 * 1000);
            String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis), TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
                    TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
            textViewTime.setText(hms);
        }
    });

    noPickerMinutes.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {


        @Override
        public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
            timer = new CounterClass((newVal * 60 * 1000), 1000);
            long millis = (newVal * 60 * 1000);
            String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis), TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
                    TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
            textViewTime.setText(hms);
        }
    });

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });
}



public class CounterClass extends CountDownTimer {


    /**
     * @param millisInFuture    The number of millis in the future from the call
     *                          to {@link #start()} until the countdown is done and {@link #onFinish()}
     *                          is called.
     * @param countDownInterval The interval along the way to receive
     *                          {@link #onTick(long)} callbacks.
     */

    public CounterClass(long millisInFuture, long countDownInterval) {
        super(millisInFuture, countDownInterval);
    }



    @TargetApi(Build.VERSION_CODES.GINGERBREAD)
    @Override

    public void onTick(long millisUntilFinished) {
        long millis = millisUntilFinished;
        String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis), TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
                TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
        System.out.println(hms);
        textViewTime.setText(hms);

    }

    @Override
    public void onFinish() {

    }


}}

共 (1) 个答案

  1. # 1 楼答案

    代码的问题是,在NumberPicker对象中,noPickerHoursnoPickerMinutes当值更改时,setOnValueChangedListener()方法被调用。如果更改noPickerHours选取器,则计时器设置为小时;如果更改noPickerMinutes选取器,则计时器设置为指定的分钟。因此,您最后更改的数字选择器将是timer的值

    因此,解决方案将是:

    int hourPicked;
    int minPicked;  // declare both as instance variables otherwise will need to declare as final variables.
    
    button.setOnClickListener(new View.OnClickListener() {
    
        @Override
        public void onClick(View v) {
            // put your logic here to set the time with hourPicked and minPicked variables.
            timer.start();
        }
    });
    
    noPickerHours.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
    
    
        @Override
        public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
           hourPicked = newVal;   
        }
    });
    
    noPickerMinutes.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
    
    
        @Override
        public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
             minPicked = newVal;  
        }
    });
    

    希望这有帮助