如何在Java中对多个组合使用打开复选框?

如何在Java中对多个组合使用打开复选框?,java,android,switch-statement,android-checkbox,Java,Android,Switch Statement,Android Checkbox,这是我在这里的第一篇文章,所以可能做得不太好。。。 我是一名软件开发专业的学生,现在我正在学习Android应用程序开发 我被要求制作一个带有4个复选框的程序,所以当我选中其中任何一个复选框时,应用程序会显示一张特定的图片。比如说 复选框1:个人 复选框2:汽车 复选框3:街道 复选框4:音乐 如果我检查了1(人)和2(车),它应该显示一个人和一辆车在同一张图片。。。我在研究这个,我发现了这个。我认为这是一个制作这个程序的好方法,但我不知道如何让它正常工作。我试着这样做: MainActivit

这是我在这里的第一篇文章,所以可能做得不太好。。。 我是一名软件开发专业的学生,现在我正在学习Android应用程序开发

我被要求制作一个带有4个复选框的程序,所以当我选中其中任何一个复选框时,应用程序会显示一张特定的图片。比如说

复选框1:个人

复选框2:汽车

复选框3:街道

复选框4:音乐

如果我检查了1(人)和2(车),它应该显示一个人和一辆车在同一张图片。。。我在研究这个,我发现了这个。我认为这是一个制作这个程序的好方法,但我不知道如何让它正常工作。我试着这样做:

MainActivity.Java:

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.CheckBox;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {

    CheckBox cb1, cb2, cb3, cb4;
    ImageView img;

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

        cb1 = findViewById(R.id.persona);
        cb2 = findViewById(R.id.car);
        cb3 = findViewById(R.id.calle);
        cb4 = findViewById(R.id.music);
        img = findViewById(R.id.imagen);

        int pattern = (cb1.isSelected() ? 0b0001 : 0)
                | (cb2.isSelected() ? 0b0010 : 0)
                | (cb3.isSelected() ? 0b0100 : 0)
                | (cb4.isSelected() ? 0b1000 : 0);
        switch (pattern) {

// No selection
            case 0b0000:

                img.setImageResource(R.drawable.def);

                break;

            //Person
            case 0b0001:

                img.setImageResource(R.drawable.wick);

                break;

            //Car
            case 0b0010:

                img.setImageResource(R.drawable.car);

                break;
        }
    }
}
activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:id="@+id/rl">

    <CheckBox
        android:id="@+id/persona"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/persona"
        android:layout_marginTop="25dp"
        android:checked="false"
        android:textSize="30sp"
        />

    <CheckBox
        android:id="@+id/car"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/car"
        android:layout_below="@id/persona"
        android:checked="false"
        android:textSize="30sp"
        />

    <CheckBox
        android:id="@+id/calle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/calle"
        android:layout_below="@id/car"
        android:checked="false"
        android:textSize="30sp"
        />

    <CheckBox
        android:id="@+id/music"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/music"
        android:layout_below="@id/calle"
        android:checked="false"
        android:textSize="30sp"
        />

    <ImageView
        android:id="@+id/imagen"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/music"
        android:layout_centerHorizontal="true"
        android:contentDescription="@string/imagen" />

</RelativeLayout>

但当我运行应用程序时,它只显示默认图像(似乎只有案例0b0000起作用?),即使我在xml中选中了特定的复选框check=“true”。。。我还尝试为每个复选框创建一个onClick事件,但似乎我没有正确使用模式变量


如果我能得到帮助,我将非常感激。。。我想我可以使用Ifs,但我个人对我在博文中读到的这种方式很感兴趣。

您需要将侦听器附加到您的复选框,并将模式检查移动到
onCheckedChanged()
方法中。通过这种方式,您的复选框可以通知活动并重新计算
模式的值:

public class MainActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener {

    CheckBox cb1, cb2, cb3, cb4;
    ImageView img;

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

        cb1 =  findViewById(R.id.persona);
        cb2 = findViewById(R.id.car);
        cb3 = findViewById(R.id.calle);
        cb4 = findViewById(R.id.music);
        img = findViewById(R.id.imagen);

        cb1.setOnCheckedChangeListener(this);
        cb2.setOnCheckedChangeListener(this);
        cb3.setOnCheckedChangeListener(this);
        cb4.setOnCheckedChangeListener(this);
    }

    @Override
    public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
        int pattern = (cb1.isChecked() ? 0b0001 : 0)
                | (cb2.isChecked() ? 0b0010 : 0)
                | (cb3.isChecked() ? 0b0100 : 0)
                | (cb4.isChecked() ? 0b1000 : 0);
        switch (pattern) {
            // No selection
            case 0b0000:
                img.setImageResource(R.drawable.def);
                break;
            //Person
            case 0b0001:
                img.setImageResource(R.drawable.wick);
                break;
            //Car
            case 0b0010:
                img.setImageResource(R.drawable.car);
                break;
        }
    }
}

您需要将侦听器附加到复选框,并将该模式检查移动到
onCheckedChanged()
方法中。通过这种方式,您的复选框可以通知活动并重新计算
模式的值:

public class MainActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener {

    CheckBox cb1, cb2, cb3, cb4;
    ImageView img;

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

        cb1 =  findViewById(R.id.persona);
        cb2 = findViewById(R.id.car);
        cb3 = findViewById(R.id.calle);
        cb4 = findViewById(R.id.music);
        img = findViewById(R.id.imagen);

        cb1.setOnCheckedChangeListener(this);
        cb2.setOnCheckedChangeListener(this);
        cb3.setOnCheckedChangeListener(this);
        cb4.setOnCheckedChangeListener(this);
    }

    @Override
    public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
        int pattern = (cb1.isChecked() ? 0b0001 : 0)
                | (cb2.isChecked() ? 0b0010 : 0)
                | (cb3.isChecked() ? 0b0100 : 0)
                | (cb4.isChecked() ? 0b1000 : 0);
        switch (pattern) {
            // No selection
            case 0b0000:
                img.setImageResource(R.drawable.def);
                break;
            //Person
            case 0b0001:
                img.setImageResource(R.drawable.wick);
                break;
            //Car
            case 0b0010:
                img.setImageResource(R.drawable.car);
                break;
        }
    }
}

嗨,谢谢你的回答。我尝试了你的方法,现在它似乎对任何复选框都有响应,但它只会使ImageView显示默认图像(就像它将任何复选框的更改作为0b0000?)。所以它不会显示正确的图像。它应该只响应哪些复选框?它应该响应所有复选框(4),所以当我按某个组合时,它会显示我设置的图片。例如,根据我以这种方式获得的帖子,如果我选择复选框1和2,则图案应等于0b0011,并显示我在这种情况下设置的图片。我更新了代码。问题是,您应该使用
isChecked()
而不是
isSelected()
Hi,谢谢您的回答。我尝试了你的方法,现在它似乎对任何复选框都有响应,但它只会使ImageView显示默认图像(就像它将任何复选框的更改作为0b0000?)。所以它不会显示正确的图像。它应该只响应哪些复选框?它应该响应所有复选框(4),所以当我按某个组合时,它会显示我设置的图片。例如,根据我以这种方式获得的帖子,如果我选择复选框1和2,则图案应等于0b0011,并显示我在这种情况下设置的图片。我更新了代码。问题是,您应该使用
isChecked()