You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从setOnClickListener获取计算数据并传入CountDownTimer作为时长参数

解决动态传入时长到CountDownTimer的问题

我来帮你搞定这个问题!你现在的核心需求是把onClick里计算出的自定义时长(duration)传给CountDownTimer,让计时器使用这个动态计算的时长运行对吧?

问题根源

你之前提前初始化了CountDownTimer,用的是固定的duration_variable,这就导致它没法获取到onClick里动态计算的duration值——毕竟CountDownTimer一旦创建,总时长就固定死了,没法后期修改。

解决方案

我们需要调整CountDownTimer的创建时机:不在类初始化时创建它,而是在onClick计算出duration之后,再动态创建并启动计时器。如果需要支持多次点击重置时长,还要记得先取消之前运行的计时器,避免多个计时器同时更新UI。

修改后的完整代码

public class page2 extends Fragment {
    private static final String TAG = "page2";
    private Button btntest;
    private TextView timer,tv2;
    private TextView tv;
    private Spinner spinner, spinner2;
    public int hours, mins, duration;
    // 只声明CountDownTimer,不提前初始化
    private CountDownTimer countDownTimer;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.page2_fragment,container,false);
        btntest = (Button) view.findViewById(R.id.button2);
        timer = (TextView) view.findViewById(R.id.Timer);
        tv2 = (TextView) view.findViewById(R.id.tv2);
        tv = (TextView) view.findViewById(R.id.textView3);
        
        // 设置spinner
        spinner = (Spinner) view.findViewById(R.id.spinner1);
        String [] values = {"00","01","02","03","04","05","06"};
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_spinner_item, values);
        adapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
        spinner.setAdapter(adapter);
        
        spinner2 = (Spinner) view.findViewById(R.id.spinner2);
        String [] values2 = {"00","10","20","30","40","50","60"};
        ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_spinner_item, values2);
        adapter2.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
        spinner2.setAdapter(adapter2);

        btntest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 计算时长(毫秒)
                String spin=spinner.getSelectedItem().toString();
                hours = Integer.parseInt(spin);
                hours = hours*3600000;
                String spin2=spinner2.getSelectedItem().toString();
                mins = Integer.parseInt(spin2);
                mins = mins*60000;
                duration = hours+mins;
                tv2.setText(String.valueOf(duration));

                // 如果之前有运行的计时器,先取消
                if(countDownTimer != null){
                    countDownTimer.cancel();
                }

                // 动态创建CountDownTimer,传入计算好的duration
                countDownTimer = new CountDownTimer(duration, 1000) {
                    @Override
                    public void onTick(long millisUntilFinished) {
                        // 这里优化参数名,避免和成员变量重名
                        String hms= String.format("%02d:%02d",
                                TimeUnit.MILLISECONDS.toHours(millisUntilFinished),
                                TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millisUntilFinished))
                        );
                        timer.setText(hms);
                    }

                    @Override
                    public void onFinish() {
                        Toast.makeText(getActivity(), "timer stopped",Toast.LENGTH_SHORT).show();
                    }
                };

                // 启动计时器
                countDownTimer.start();
            }
        });
        return view;
    }
}

关键修改点说明

  • 延迟创建CountDownTimer:把countDownTimer改成仅声明,不在类初始化时创建,而是在onClick里拿到duration后再实例化,这样就能直接使用动态计算的时长。
  • 取消旧计时器:每次点击按钮时,如果之前有正在运行的计时器,先调用cancel(),避免多个计时器同时更新UI导致混乱。
  • 参数名优化:把onTick的参数名从duration_variable改成millisUntilFinished,更符合Android官方命名规范,也避免和成员变量混淆。

内容的提问来源于stack exchange,提问作者jnrx gaming

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:57:56