如何在另一个外部类变量中分配进度条的值来执行计算?

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。

以上是关于如何在另一个外部类变量中分配进度条的值来执行计算?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用指针在另一个函数中分配数组

如何在模板类函数中分配struct值?

如何在 swift 4 的闭包中分配类属性

在单个代码行 C# 中分配多个变量

C ++从不同的函数中分配类成员的值

如何使用 Ruby 块在厨师食谱中分配变量