如何从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
相关产品推荐
相关产品推荐

