If-else 语句和可见性 - android

问题描述 投票:0回答:2

我的应用程序中有五个复选框和五个进度条,并根据复选框调用可见性以使进度条可见/消失。那么,在可见性方法中是否有任何替代 if-else 语句的方法,因为在这种情况下,五个复选框中有无限的可能性,所以我必须编写无限的 if else 语句,以使进度条在所有可能性中可见/消失.

例如-如果CheckBox1&checkbox2被选中,则使progressbar2可见 如果选中了 checkbox1&checkbox3,则使进度条2可见

换句话说,如果选中任何一个复选框,我想让进度条 1 可见;如果选中任意两个复选框,我想让进度条 2 可见,依此类推..

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ProgressBar;

public class Progress extends Activity {

    ProgressBar progressBar1;
    ProgressBar progressBar2;

    CheckBox checkBox1;
    CheckBox checkBox2;

    SharedPreferences sharedPreferences;
    SharedPreferences.Editor editor;
    SharedPreferences setprefsd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_progress);

        setprefsd = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        progressBar1 = (ProgressBar) findViewById(R.id.progressBar1);
        progressBar2 = (ProgressBar) findViewById(R.id.progressBar2);
        checkBox1 = (CheckBox) findViewById(R.id.checkBox1);
        checkBox2 = (CheckBox) findViewById(R.id.checkBox2);

        if (setprefsd.getBoolean("FirstCheckBox", false) == true) {
            checkBox1.setChecked(true);
            updateProgressBars();
        }

        if (setprefsd.getBoolean("SecondCheckBox", false) == true) {
            checkBox2.setChecked(true);
            updateProgressBars();
        }
    }

    public void updateProgressBars() {
        progressBar1.setVisibility(View.GONE);
        progressBar2.setVisibility(View.GONE);

        if (checkBox1.isChecked() && checkBox2.isChecked()) {
            progressBar2.setVisibility(View.VISIBLE);
        } else if (checkBox1.isChecked()) {
            progressBar1.setVisibility(View.VISIBLE);
        }
    }
}
android if-statement visibility
2个回答
2
投票

简短回答

您可以使用三元运算符来使可见性更改更简单(而不是

if
)。

我想这里的方法是计算复选框的数量,然后设置可见性。你只需要像这样改变你的

updateProgressBars()
方法:

public void updateProgressBars() {
    int nbCheckboxes = 0;
    if (checkBox1.isChecked())
        nbCheckboxes++;
    if (checkBox2.isChecked())
        nbCheckboxes++;

    progressBar1.setVisibility(nbCheckboxes >= 1 ? View.VISIBLE : View.GONE);
    progressBar2.setVisibility(nbCheckboxes >= 2 ? View.VISIBLE : View.GONE);
}

其他备注

带有布尔表达式的 IF 语句

您正在使用以下结构:

if (myBooleanExpression == true)

不需要

== true
,因为您在此处使用布尔表达式。代替使用:

if (myBooleanExpression)

使用数组作为变量

如果您使用多个具有相同用途的编号变量,您可能需要考虑使用数组。

public class Progress extends Activity {

    ProgressBar[] progressBars;
    CheckBox[] checkBoxes;

    SharedPreferences sharedPreferences;
    SharedPreferences.Editor editor;
    SharedPreferences setprefsd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_progress);

        setprefsd = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

        progressBars = new ProgressBar[3]; // 3, or whatever number you have
        progressBars[0] = (ProgressBar) findViewById(R.id.progressBar1); 
        progressBars[1] = (ProgressBar) findViewById(R.id.progressBar2); 
        progressBars[2] = (ProgressBar) findViewById(R.id.progressBar3);

        checkBoxes = new CheckBox[3];  // 3 or whatever number you have
        checkBoxes[0] = (CheckBox) findViewById(R.id.checkBox1);
        checkBoxes[1] = (CheckBox) findViewById(R.id.checkBox2);
        checkBoxes[2] = (CheckBox) findViewById(R.id.checkBox3);

        checkBoxes[0].setChecked(setprefsd.getBoolean("FirstCheckBox", false));
        checkBoxes[1].setChecked(setprefsd.getBoolean("SecondCheckBox", false));
        checkBoxes[2].setChecked(setprefsd.getBoolean("ThirdCheckBox", false));

        updateProgressBars();
    }

    public void updateProgressBars() {
        int nbCheckBoxes = 0;
        for (CheckBox cb : checkBoxes) {
            if (cb.isChecked())
                nbCheckBoxes++;
        }

        for (int i = 0; i < progressBars.length; i++) {
            progressBars[i].setVisibility(nbCheckboxes > i ? View.VISIBLE : View.GONE);
        }
    }
}

0
投票

如果您有 3 个场景需要检查 9 次状况。

喜欢:

if (!mCallType.isIncall() && mCallType.isOutcall() && mCallType.isTelecall()) {
  glInCall.setVisibility(View.GONE);
  glOutCall.setVisibility(View.VISIBLE);
  glTeleCall.setVisibility(View.VISIBLE);
} else if (mCallType.isIncall() && !mCallType.isOutcall() && mCallType.isTelecall()) {
  glOutCall.setVisibility(View.GONE);
  glInCall.setVisibility(View.VISIBLE);
  glTeleCall.setVisibility(View.VISIBLE);
} else if (mCallType.isIncall() && mCallType.isOutcall() && !mCallType.isTelecall()) {
  glTeleCall.setVisibility(View.GONE);
  glOutCall.setVisibility(View.VISIBLE);
  glInCall.setVisibility(View.VISIBLE);
} else {
  glOutCall.setVisibility(View.VISIBLE);
  glInCall.setVisibility(View.VISIBLE);
  glTeleCall.setVisibility(View.VISIBLE);
}

那就不要使用“IF, ELSE IF”条件。

最好的替代品是HashMap

HashMap visiblityManager = new HashMap<>();   // Visibility Manage without if else condition.
visiblityManager.put(true, View.VISIBLE);
visiblityManager.put(false, View.GONE);

glInCall.setVisibility((Integer) visiblityManager.get(mCallType.isIncall()));  // This Data comes from API or Database. it is a Boolean data.
glOutCall.setVisibility((Integer) visiblityManager.get(mCallType.isOutcall())); // This Data comes from API or Database. it is a Boolean data.
glTeleCall.setVisibility((Integer) visiblityManager.get(mCallType.isTelecall())); // This Data comes from API or Database. it is a Boolean data.
© www.soinside.com 2019 - 2024. All rights reserved.