如何在另一个外部类变量中分配进度条的值来执行计算?
Posted
技术标签:
【中文标题】如何在另一个外部类变量中分配进度条的值来执行计算?【英文标题】:how to assign the value of a progressbar in another outerclass variable to perform calculation? 【发布时间】:2021-09-14 10:14:28 【问题描述】:所以我一直在尝试在 android studio 中制作这个 BMI 计算器,当您将进度条拖动到任何值时,您的 BMI 将立即得到计算。
为了执行这个,我所做的是-
在Bundle类里面,
我直接声明了2个变量,分配其中一个从身高进度条获取数据,另一个从体重进度条获取数据。
然后我编写了计算和文本设置的典型代码。
它没有工作
因为我自己对此很陌生,我真的找不到我的错误。
所以我得到的结果是 - 一个静止的 BMI,这是我为身高和体重设置的进度条的初始值的结果。
我感觉我在某个地方犯了一个非常愚蠢的错误,但我仍然无法注意到。 你能指出这一点吗?
我使用的Java代码如下,请查看-
BMI 的代码在最后。我觉得问题出在那儿。
这是应用程序的屏幕截图-
screenshot2
screenshot1
这是我的代码--
public class MainActivity extends AppCompatActivity
TextView mheighttext,mweighttext2,mbmitext,mfunnymsg;
SeekBar mbar1, mbar2;
RelativeLayout mweightlayout, mlayout3;
ImageView mgincbtn1,mgincbtn2,mgdecbtn1,mgdecbtn2;
String mbmi, bmitext;
int wt= 45;
String wtwt="45";
int ht= 158;
String htht="158";
float rslt;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
mheighttext=findViewById(R.id.heighttext);
mweighttext2=findViewById(R.id.weighttext2);
mbar1= findViewById(R.id.bar1);
mbar2=findViewById(R.id.bar2);
mgincbtn1=findViewById(R.id.gincbtn1);
mgincbtn2=findViewById(R.id.gincbtn2);
mgdecbtn1=findViewById(R.id.gdecbtn1);
mgdecbtn2=findViewById(R.id.gdecbtn2);
mbmitext=findViewById(R.id.bmitext1);
mfunnymsg=findViewById(R.id.funnymsg);
mbar1.setMax(246);
mbar1.setProgress(160);
mbar1.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
ht=progress;
htht=String.valueOf(ht);
mheighttext.setText(htht);
@Override
public void onStartTrackingTouch(SeekBar seekBar)
@Override
public void onStopTrackingTouch(SeekBar seekBar)
);
mbar2.setMax(244);
mbar2.setProgress(50);
mbar2.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
wt=progress;
wtwt=String.valueOf(wt);
mweighttext2.setText(wtwt);
@Override
public void onStartTrackingTouch(SeekBar seekBar)
@Override
public void onStopTrackingTouch(SeekBar seekBar)
);
mgincbtn1.setOnClickListener(v ->
ht=ht+1;
if (ht>=0 && ht<247)
mbar1.setProgress(ht);
htht = String.valueOf(ht);
mheighttext.setText(htht);
);
mgdecbtn1.setOnClickListener(v ->
ht=ht-1;
if (ht>=0 && ht<247)
mbar1.setProgress(ht);
htht = String.valueOf(ht);
mheighttext.setText(htht);
);
mgincbtn2.setOnClickListener(view ->
wt=wt+1;
if (wt>=0 && wt<244)
mbar2.setProgress(wt);
wtwt = String.valueOf(wt);
mweighttext2.setText(wtwt);
);
mgdecbtn2.setOnClickListener(v ->
wt=wt-1;
if (wt>=0 && wt<244)
mbar2.setProgress(wt);
wtwt = String.valueOf(wt);
mweighttext2.setText(wtwt);
);
int htt = mbar1.getProgress();
int wtt = mbar2.getProgress();
float httt=htt/100;
rslt= wtt/(httt*httt);
mbmi=Float.toString(rslt);
mbmitext.setText(mbmi);
【问题讨论】:
您的变量命名约定不是很清楚知道哪个按钮是哪个,但我想这是因为计算是在与应用程序的状态无关的情况下完成的。尝试添加一个计算按钮,然后将计算代码移动到单击按钮时将调用的方法 【参考方案1】:您可能希望将计算 BMI 的代码的 sn-p(可能是最后 4 行代码)放入 onProgressChanged()
中,以便在身高/体重发生变化时立即计算 BMI。由于您正在为身高和体重设置全局变量,因此您将获得每个变量的当前值。
你也可以像这样创建一个计算 BMI 的函数:
private float calculateBMI(int height, int weight)
float ht = height / 100;
float result = weight / (ht * ht);
return result;
并像这样在onProgressChanged()
中调用此函数(例如,对于 weight):
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
wt = progress;
mweighttext2.setText(String.valueOf(getBMI(ht, progress)));
【讨论】:
【参考方案2】:移动你的代码...
int htt = mbar1.getProgress();
int wtt = mbar2.getProgress();
float httt=htt/100;
rslt= wtt/(httt*httt);
mbmi=Float.toString(rslt);
mbmitext.setText(mbmi);
对方法说
public void computeBMI()
int htt = mbar1.getProgress();
int wtt = mbar2.getProgress();
float httt=htt/100;
rslt= wtt/(httt*httt);
mbmi=Float.toString(rslt);
mbmitext.setText(mbmi);
然后在您的 UI 中添加一个按钮,例如 mCompute。然后,在您的 oncreate 方法中,您可以实现该按钮 onClickListener 以调用上面的 computeBMI()。
即:
yourButton.setOnclickListener((v)->
computeBMI();
);
【讨论】:
当用户改变身高/体重时,这不会立即计算和显示 BMI。以上是关于如何在另一个外部类变量中分配进度条的值来执行计算?的主要内容,如果未能解决你的问题,请参考以下文章