TextView不会自动从SeekBar进度更新

时间:2013-12-29 01:46:01

标签: java android seekbar

我的应用中的SeekBar未产生正确的结果。 SeekBar从0开始,因此sbSyst为每个值添加70,sbDias为每个值添加40。

部分代码:

public void ShowText() {
        int inOne = sbSyst.getProgress();
        int inTwo = sbDias.getProgress();

        if ((inOne >= 0 && inOne <= 20) && (inTwo >= 0 && inTwo <= 20)) {
            tvRes.setText("LOW");
            tvRes.setBackgroundColor(Color.parseColor("#7659F5"));
        }
        else if ((inOne >= 21 && inOne <= 50) && (inTwo >= 21 && inTwo <= 40)) {
            tvRes.setText("IDEAL");
            tvRes.setBackgroundColor(Color.parseColor("#0BA319"));
        }
        else if ((inOne >= 51 && inOne <= 70) && (inTwo >= 41 && inTwo <= 50)) {
            tvRes.setText("PRE-HIGH");
            tvRes.setBackgroundColor(Color.parseColor("#D7EF0C"));
        }
        else if ((inOne >= 71 && inOne <= 120) && (inTwo >= 51 && inTwo <= 60)) {
            tvRes.setText("HIGH");
            tvRes.setBackgroundColor(Color.parseColor("#F70729"));
        }
    }

根据上面的代码,以下应该生成“HIGH”作为文本,而不是显示“IDEAL”

enter image description here

以下是整个代码的Pastebin: http://pastebin.com/C91SpbBg

请帮我解决这个问题。

更新:添加以下内容并且它正在100%

工作
public void ShowText() {
    int inOne = sbSyst.getProgress() + 70;
    int inTwo = sbDias.getProgress() + 40;

    Log.i("SYSTOLIC SHOWTEXT", String.valueOf(inOne));
    Log.i("DIASTOLIC SHOWTEXT", String.valueOf(inTwo));

    if ((inOne >= 70 && inOne <= 90) && (inTwo >= 40 && inTwo <= 60)) {
        tvRes.setText("LOW");
        tvRes.setBackgroundColor(Color.parseColor("#7659F5"));
    }
    if ((inOne >= 70 && inOne <= 90) && (inTwo >= 61 && inTwo <= 80)) {
        tvRes.setText("IDEAL");
        tvRes.setBackgroundColor(Color.parseColor("#0BA319"));
    }
    if ((inOne >= 70 && inOne <= 90) && (inTwo >= 81 && inTwo <= 90)) {
        tvRes.setText("PRE-HIGH");
        tvRes.setBackgroundColor(Color.parseColor("#C9DF0B"));
    }
    if ((inOne >= 70 && inOne <= 90) && (inTwo >= 91 && inTwo <= 100)) {
        tvRes.setText("HIGH");
        tvRes.setBackgroundColor(Color.parseColor("#F70729"));
    }

    if ((inOne >= 91 && inOne <= 120) && (inTwo >= 40 && inTwo <= 80)) {
        tvRes.setText("IDEAL");
        tvRes.setBackgroundColor(Color.parseColor("#0BA319"));
    }
    if ((inOne >= 91 && inOne <= 120) && (inTwo >= 81 && inTwo <= 90)) {
        tvRes.setText("PRE-HIGH");
        tvRes.setBackgroundColor(Color.parseColor("#C9DF0B"));
    }
    if ((inOne >= 91 && inOne <= 120) && (inTwo >= 91 && inTwo <= 100)) {
        tvRes.setText("HIGH");
        tvRes.setBackgroundColor(Color.parseColor("#F70729"));
    }

    if ((inOne >= 121 && inOne <= 140) && (inTwo >= 40 && inTwo <= 90)) {
        tvRes.setText("PRE-HIGH");
        tvRes.setBackgroundColor(Color.parseColor("#C9DF0B"));
    }
    if ((inOne >= 121 && inOne <= 140) && (inTwo >= 91 && inTwo <= 100)) {
        tvRes.setText("HIGH");
        tvRes.setBackgroundColor(Color.parseColor("#F70729"));
    }

    if ((inOne >= 141 && inOne <= 190) && (inTwo >= 40 && inTwo <= 100)) {
        tvRes.setText("HIGH");
        tvRes.setBackgroundColor(Color.parseColor("#F70729"));
    }
}

3 个答案:

答案 0 :(得分:2)

根据上面的图片,inOne=82inTwo=26的值。现在查看代码,显示HIGH

if ((inOne >= 71 && inOne <= 120) && (inTwo >= 51 && inTwo <= 60))

事实并非如此,因为您使用的是&&运算符。这意味着两者都应该在高范围内。这就是问题所在。

解决方案:当其中一个值在High范围内且Low范围内的值等等时,请考虑如何处理这种情况。然后相应地编写你的逻辑。 (示例:您也可以使用||运算符,这意味着如果其中任何一个为“HIGH”显示为高。)

更新:这是一个good source,您可以在其中阅读有关解释血压读数的不同if/else规则。

更新2:我有空闲时间。以下是基于上述链接的showText()方法的实现:

public void ShowText() {
    int inOne = sbSyst.getProgress() + 70;
    int inTwo = sbDias.getProgress() + 40;

    if((inOne >= 140) || (inTwo >= 90)) {
        // condition 1: if 140 or more systolic or 90 or more diastolic means HIGH BP
        tvRes.setText("HIGH");
        tvRes.setBackgroundColor(Color.parseColor("#F70729"));
    }
    else if((inOne <= 90) || (inTwo <= 60)){
        // (condition 1 is not met)
        // condition 2: if 90 or less systolic or 60 or less diastolic means LOW BP
        tvRes.setText("LOW");
        tvRes.setBackgroundColor(Color.parseColor("#7659F5"));
    }
    else if((inOne >= 120) || (inTwo >= 80)) {
        // (condition 1 and 2 are not met ==> NOT HIGH, NOT LOW)
        // condition 3: if 120 or more systolic or 80 or more diastolic means PRE-HIGH BP
        tvRes.setText("PRE-HIGH");
        tvRes.setBackgroundColor(Color.parseColor("#D7EF0C"));
    }
    else if((inOne >= 90) || (inTwo >= 60)) {
        // (condition 1, 2 and 3  are not met ==> NOT HIGH, NOT LOW, NOT PRE-HIGH)
        // condition 4: if 90 or more systolic or 60 or more diastolic means IDEAL BP
        tvRes.setText("IDEAL");
        tvRes.setBackgroundColor(Color.parseColor("#0BA319"));
    }
}

答案 1 :(得分:2)

您的代码中存在逻辑错误。因为你使用了&amp;&amp;和&amp;&amp;运营商。

原因如下:

inOne = 82且inTwo = 26

 else if ((inOne >= 71 && inOne <= 120) && (inTwo >= 51 && inTwo <= 60))

在上面的if条件中,它检查inOne是否位于71和120之间,这里它是因为inOne是82.所以这变为真。现在你的第二个条件就是失败了。

它检查inTwo是否介于51和60之间,而不是因为值为26,所以返回false。你的if条件现在是:

 if((true) && (false)){
 // Set Text HIGH
 }

因为您使用了&amp;&amp;运算符,只有当两个条件都为真时才会执行此条件,而不是在您的情况下。所以它永远不会在其中执行代码!

答案 2 :(得分:1)

我会将其作为2D矩阵的灵活解决方案来实现。如果每行对应于收缩压的范围,则每行中的每列对应于舒张压范围,矩阵(行,列)中的值是结果值......

给定收缩压找到对应的行,在行内找到使用舒张压和读出值对应的列。

然后将值映射到带有结果的框的文本/颜色。

这将允许您针对不同的性别,年龄,体重,种族......进行多次映射......只需一个代码,加上无法使用您的AND / OR代码进行建模的组合......