java - 一旦计时器达到0,计算每分钟的频率
问题描述
更新 - 下面的解决方案
我是 Java 新手(和整个编程),真的可以使用一些帮助。
我正在研究一个包含计时器和计数器的片段。用户在编辑文本中输入一个数字并点击“设置”按钮以将计时器设置为以分钟为单位的数字。还有一个频率计数器,每次单击它都会增加 1。当计时器达到零时,我想要一个“速率”文本视图来显示将按钮被点击的次数除以分钟数的结果;速率 = 频率/分钟。例如:如果分钟 = 5 和频率 = 7,我希望速率文本视图显示“0.71”。
到目前为止,我已经让计时器和计数器工作了,但我无法让费率计算工作。我不断得到“无穷大”,这从我所读到的意思是我正在除以一个整数。我不知道哪个数字仍然是整数。我也不确定我的代码布局是否正确(也许我在声明不应该的地方?)
任何帮助将不胜感激。提前致谢!
我尝试使用 try/catch 语句来避免除以 0。在 XML 中,我尝试将输入类型设置为“numberDecimal”我尝试在转换之前将编辑文本转换为整数和文本视图转换为字符串到双打我尝试将编辑文本和计数器直接转换为双打。我搜索了 stackoverflow、Quora 和 YouTube 以确保我的计算正确。
解决方案
@Override
public void onFinish() {
mTimerRunning = false;
button_start_pause.setText("Start");
button_start_pause.setVisibility(android.view.View.INVISIBLE);
button_reset.setVisibility(android.view.View.VISIBLE);
text_view_rate.setVisibility(android.view.View.VISIBLE);
calculaterate();
}
}.start();
mTimerRunning = true;
button_start_pause.setText("Pause");
}
public void pauseTimer() {
countDownTimer.cancel();
mTimerRunning = false;
button_start_pause.setText("Start");
updateCountDownText();
}
public void resetTimer() {
if (mTimerRunning) {
countDownTimer.cancel();
mTimeLeftInMillis = (mStartTimeInMillis + 1000);
updateWatchInterface();
startTimer();
} else {
mTimeLeftInMillis = (mStartTimeInMillis);
updateCountDownText();
updateWatchInterface();
button_reset.setVisibility(android.view.View.VISIBLE);
button_start_pause.setVisibility(android.view.View.VISIBLE);
}
}
public void calculaterate() {
double numerator = Double.parseDouble(text_view_frequency.getText().toString());
double denominator = (mStartTimeInMillis/1000)/60;
double rate = (numerator)/(denominator);
DecimalFormat df = new DecimalFormat("#.00");
String ratecalc = df.format(rate);
text_view_rate.setText(ratecalc);
}
片段和组件 ID
public class fragmentrate extends Fragment {
private EditText edit_text_input;
private TextView text_view_countdown;
private TextView text_view_frequency;
private TextView text_view_rate;
private TextView rate_equals;
private Button button_start_pause;
private Button button_reset;
private Button button_set;
private Button button_frequency;
private Button button_reset_frequency;
private CountDownTimer countDownTimer;
private boolean mTimerRunning;
private long mStartTimeInMillis;
private long mTimeLeftInMillis = mStartTimeInMillis;
private long mEndTime;
private int mCounter;
private double denominator;
View View;
public View onCreateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container, @NonNull Bundle savedInstanceState) {
View = inflater.inflate(R.layout.rate_fragment, container, false);
text_view_countdown = View.findViewById(R.id.text_view_countdown);
button_start_pause = View.findViewById(R.id.button_start_pause);
button_reset = View.findViewById(R.id.button_reset);
button_frequency = View.findViewById(R.id.button_frequency);
button_reset_frequency = View.findViewById(R.id.button_reset_frequency);
edit_text_input = View.findViewById(R.id.edit_text_input);
button_set = View.findViewById(R.id.button_set);
text_view_frequency = View.findViewById(R.id.text_view_frequency);
text_view_rate = View.findViewById(R.id.text_view_rate);
rate_equals = View.findViewById(R.id.rate_equals);
频率计数器
button_frequency.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(android.view.View view) {
mCounter ++;
text_view_frequency.setText(Integer.toString(mCounter));
}
});
button_reset_frequency.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(android.view.View view) {
mCounter = 0;
text_view_frequency.setText(Integer.toString(mCounter));
}
});
计时器和费率计算
button_set.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(android.view.View view) {
String input = edit_text_input.getText().toString();
if (input.length() == 0) {
Toast.makeText(getActivity(), "Please enter a number", Toast.LENGTH_SHORT).show();
return;
}
long millisInput = Long.parseLong(input) * 60000;
if (millisInput == 0) {
Toast.makeText(getActivity(), "Please enter a positive number", Toast.LENGTH_SHORT).show();
return;
}
setTime(millisInput);
edit_text_input.setText("");
}
});
button_start_pause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(android.view.View view) {
if (mTimerRunning) {
pauseTimer();
} else {
startTimer();
}
}
});
button_reset.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(android.view.View view) {
if(mTimerRunning) {
resetTimer();
} else{
resetTimer();
}
}
});
return View;
}
private void setTime(long milliseconds) {
mStartTimeInMillis = milliseconds;
resetTimer();
}
private void startTimer() {
mEndTime = System.currentTimeMillis() + mTimeLeftInMillis;
countDownTimer = new CountDownTimer(mTimeLeftInMillis, 100) {
@Override
public void onTick(long millisUntilFinished) {
mTimeLeftInMillis = millisUntilFinished;
updateCountDownText();
}
@Override
public void onFinish() {
mTimerRunning = false;
button_start_pause.setText("Start");
button_start_pause.setVisibility(android.view.View.INVISIBLE);
button_reset.setVisibility(android.view.View.VISIBLE);
try {
double denominator = Integer.parseInt(edit_text_input.getText().toString());
double rate = ((double)mCounter/denominator);
text_view_rate.setText(Double.toString(rate));
}
catch (NumberFormatException e)
{
}
}
}.start();
mTimerRunning = true;
button_start_pause.setText("Pause");
}
private void pauseTimer() {
countDownTimer.cancel();
mTimerRunning = false;
updateCountDownText();
button_start_pause.setText("Start");
}
private void resetTimer() {
if (mTimerRunning) {
countDownTimer.cancel();
mTimeLeftInMillis = (mStartTimeInMillis + 1000);
updateWatchInterface();
startTimer();
} else {
}
mTimeLeftInMillis = (mStartTimeInMillis);
updateCountDownText();
updateWatchInterface();
button_reset.setVisibility(android.view.View.VISIBLE);
button_start_pause.setVisibility(android.view.View.VISIBLE);
}
private void updateCountDownText() {
int minutes = (int) (mTimeLeftInMillis/1000)/60;
int seconds = (int) (mTimeLeftInMillis/1000)%60;
String timeLeftFormatted = String.format(Locale.getDefault(),
timeLeftFormatted = String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds));
text_view_countdown.setText(timeLeftFormatted);
}
我预计 5/7 的输出为 0.71,但实际输出为“Infinity”
解决方案
推荐阅读
- pyspark - 带有参数值的 pyspark 过滤器不起作用
- java - Java 映射到父类
- scala - 如何使用关系运算符作为变量过滤 Spark scala 中的数据框?
- sqlite - 在 sqlite 查询中比较日期格式时出错
- python - MongoDB - PyMongo 读取性能增强
- rest - IIS 中的代理到私人 Prismic 存储库 - 有可能吗?
- reactjs - TextField 失去焦点
- android - 将特定活动保持在后台堆栈之上
- python - 带有 TikZ 风格路径装饰的 Matplotlib 注释箭头
- scala - “产品”是否意味着“反射”?