[英]Printing multiple checkbox names only when they are checked
我有復選框列表,每次單擊顯示消息按鈕時都想打印他們的名字。 該消息顯示為 android.widget.Toast。 如果選中多個復選框,我想將它們全部打印在一個字符串中。 我正在使用 switch-case 語句來確定單擊了哪些復選框,並在某些情況下將新名稱添加到我的結果字符串中。
case R.id.cbox_choclate_syrup:
if (checked)
tag = tag + "chocolate syrup ";
break;
我這里有問題。 結果字符串是在類的開頭和第一次點擊按鈕后創建的,對於第二次點擊它包含相同的項目名稱,即使它們沒有被選中。 我可以添加更多項目,但結果字符串永遠不會被重置。
public void tosMessage(String message){
Context context = getApplicationContext();
CharSequence msg = message;
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, msg, duration);
toast.show();
// resetting the result string.
tag = "Toppings: ";
}
如上所示,我嘗試在屬於按鈕的 onClick 方法的末尾重置結果字符串。 在這種情況下,即使我沒有取消選中它們,先前選中的項目也會在第二次單擊時被刪除。
public class MainActivity extends AppCompatActivity {
public static String tag = "Toppings: ";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onCheckboxClicked(View view) {
// is the view now checked.
boolean checked = ((CheckBox) view).isChecked();
// check which checkbox is checked?
switch (view.getId()){
case R.id.cbox_choclate_syrup:
if (checked)
tag = tag + "chocolate syrup ";
break;
case R.id.cbox_sprinkles:
if (checked)
tag = tag + "sprinkles ";
break;
case R.id.cbox_crushed_nuts:
if (checked)
tag = tag + "crushed nuts ";
break;
case R.id.cbox_cherries:
if (checked)
tag = tag + "cherries ";
break;
case R.id.cbox_orio_cookie_crumbles:
if (checked)
tag = tag + "orio cookie crumbles ";
break;
}
}
public void tosMessage(String message){
Context context = getApplicationContext();
CharSequence msg = message;
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, msg, duration);
toast.show();
tag = "Toppings: ";
}
public void showMsg(View view) {
tosMessage(tag);
}
}
我希望每次單擊按鈕時只打印和專門檢查的項目名稱。 請幫我找到解決方案。
您應該首先檢查是否已經選擇了某些內容,然后根據它更改字符串。 我也稍微改變了你的邏輯。
public class MainActivity extends AppCompatActivity {
public static String tag = "Toppings: ";
//KEEP REFERENCE TO SELECTIONS
boolean isCboxChoclateSyrupChecked = false;
boolean isCboxSprinklesChecked = false;
boolean isCboxCrushedNutsChecked = false;
boolean isCboxCherriesChecked = false;
boolean isCboxOrioCookieCrumblesChecked = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onCheckboxClicked(View view) {
// is the view now checked.
boolean checked = ((CheckBox) view).isChecked();
// check which checkbox is checked?
switch (view.getId()){
case R.id.cbox_choclate_syrup:
if (checked){
isCboxChoclateSyrupChecked = true;
}else{
isCboxChoclateSyrupChecked = false;
}
break;
case R.id.cbox_sprinkles:
if (checked){
isCboxSprinklesChecked = true;
}else{
isCboxSprinklesChecked = false;
}
break;
case R.id.cbox_crushed_nuts:
if (checked){
isCboxCrushedNutsChecked = true;
}else{
isCboxCrushedNutsChecked = false;
}
break;
case R.id.cbox_cherries:
if (checked){
isCboxCherriesChecked = true;
}else{
isCboxCherriesChecked = false;
}
break;
case R.id.cbox_orio_cookie_crumbles:
if (checked){
isCboxOrioCookieCrumblesChecked = true;
}else{
isCboxOrioCookieCrumblesChecked = false;
}
break;
}
}
public void tosMessage(String messageTag){
String getAllSelected = "";
if (isCboxChoclateSyrupChecked){
getAllSelected = getAllSelected + "chocolate syrup ";
}
if (isCboxSprinklesChecked){
getAllSelected = getAllSelected + "sprinkles ";
}
if (isCboxCrushedNutsChecked){
getAllSelected = getAllSelected + "crushed nuts ";
}
if (isCboxCherriesChecked){
getAllSelected = getAllSelected + "cherries ";
}
if (isCboxOrioCookieCrumblesChecked){
getAllSelected = getAllSelected + "orio cookie crumbles ";
}
Toast toast = Toast.makeText(getApplicationContext(), messageTag+" "+getAllSelected, Toast.LENGTH_SHORT);
toast.show();
}
public void showMsg(View view) {
tosMessage(tag);
}
}
如果您選擇了櫻桃和灑水,您的吐司應該顯示:
Toppings: cherries sprinkles
首先在 Java 文件中聲明復選框
CheckBox cbox_choclate_syrup,cbox_sprinkles,cbox_crushed_nuts,cbox_cherries, cbox_orio_cookie_crumbles;
然后復制並粘貼以下函數:
private void setupFindViewById(){
CheckBox cbox_choclate_syrup = findViewById(R.id.cbox_choclate_syrup);
cbox_sprinkles = findViewById(R.id.cbox_sprinkles);
cbox_crushed_nuts = findViewById(R.id.cbox_crushed_nuts);
cbox_cherries = findViewById(R.id.cbox_cherries);
cbox_orio_cookie_crumbles = findViewById(R.id.cbox_orio_cookie_crumbles);
}
private CheckBox[] getCheckBoxArray(){
return new CheckBox[]{
CheckBox cbox_choclate_syrup,cbox_sprinkles,cbox_crushed_nuts,cbox_cherries, cbox_orio_cookie_crumbles
};
}
在您的 onCreate 方法中調用 setupFindViewById()
現在用以下內容替換您的onCheckboxClicked
方法:
public void onCheckboxClicked(View view) {
tag = "Toppings: ";
for(CheckBox checkBox: getCheckBoxArray()){
boolean checked = checkBox.isChecked();
switch (checkBox.getId()){
case R.id.cbox_choclate_syrup:
if (checked)
tag = tag + "chocolate syrup ";
break;
case R.id.cbox_sprinkles:
if (checked)
tag = tag + "sprinkles ";
break;
case R.id.cbox_crushed_nuts:
if (checked)
tag = tag + "crushed nuts ";
break;
case R.id.cbox_cherries:
if (checked)
tag = tag + "cherries ";
break;
case R.id.cbox_orio_cookie_crumbles:
if (checked)
tag = tag + "orio cookie crumbles ";
break;
}
}
}
現在你可以開始了:
我所做的:首先,我們需要與您的小部件相對應的變量。 然后我們創建了一個函數getCheckBoxArray()
這將返回一個復選框數組。 在onCheckboxClicked
方法中,我們遍歷數組,因為我們要檢查每個復選框的狀態
評論中提到的問題:
但是,它不適用於第二次單擊按鈕。 讓我解釋; 當我選擇櫻桃和灑水並單擊顯示消息按鈕時,吐司會完美地顯示我在復選框中選擇的兩個澆頭。 但是沒有任何復選框鏈(所有復選框保持與第一次單擊相同)並在按鈕上進行第二次單擊,吐司顯示為空。 我想我需要一種方法來重置我的標簽,但在哪里?
發生這種情況是因為標簽變量的值設置為tag = "Toppings: ";
在tosMessage(String message)
方法中。 如果您從此方法中刪除該行,則它應該可以正常工作。
當view.getId()
等於的情形之一的,在該聲明case
運行,並break
終止了整個switch-case
,因此應用程序沒有檢查其他CkeckBox
秒。 所以你必須用if-else-if
替換 switch 語句。
int id= view.getId();
if(id == R.id.cbox_choclate_syrup){
if(checked)
tag = tag + "chocolate syrup ";
}
else if(id == R.id.cbox_sprinkles){
if(checked)
tag = tag + "sprinkles ";
}
else if(id == R.id.cbox_crushed_nuts){
if(checked)
tag = tag + "crushed nuts ";
}
else if(id == R.id.cbox_cherries){
if(checked)
tag = tag + "cherries ";
}
else if(id == R.id.cbox_orio_cookie_crumbles){
if(checked)
tag = tag + "orio cookie crumbles ";
}
注意:刪除 break 語句將不起作用。
將 ch1,ch2,ch3,ch4,ch5 聲明為 Checkbox 。 並將 message 作為私有和全局 String ,將其值分配給 "Toppings:" 。
CheckBox ch1,ch2,ch3,ch4,ch5;
private String message = "Toppings: ";
在 onCraete 方法中,通過 findViewById() 獲取 ch1、ch2、ch3、ch4、ch5 的引用。
ch1 = findViewById(R.id.checkBox_chocolate_syrup);
ch2 = findViewById(R.id.checkBox_sprinkles);
ch3 = findViewById(R.id.checkBox_crushed_nuts);
ch4 = findViewById(R.id.checkBox_cherries);
ch5 = findViewById(R.id.checkBox_orio_cookie);
創建一個名為 showToast() 的自定義方法。
public void showToast () {
if (ch1.isChecked()) {
message += ch1.getText().toString() + " ";
}
if (ch2.isChecked()) {
message += ch2.getText().toString() + " ";
}
if (ch3.isChecked()) {
message += ch3.getText().toString() + " ";
}
if (ch4.isChecked()) {
message += ch4.getText().toString() + " ";
}
if (ch5.isChecked()) {
message += ch5.getText().toString() + " ";
}
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
}
我們將 displayToast() 另一個方法定義為 android:onClick 屬性的值,以通過 Button 單擊顯示 toast。 現在我們將調用它的 showToast() 方法來顯示 toast,然后我們將重置消息字符串以准備下次點擊。
public void displayToast(View view) {
showToast();
message = "Toppings: ";
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.