复选框显示索引而不是文本

时间:2014-04-23 16:38:16

标签: java android checkbox

我是android的新手,目前是我在I.t的第二年。

我正在购买一个购物清单应用项目,在那里我显示一个杂货清单供用户选择并在下一个屏幕上显示(屏幕2)。

我遇到的问题是,当我单击“显示列表”按钮时,它会显示所选复选框的索引而不是显示的文本...我尝试使用ListActivity在CheckedTextView中显示数组但是也没有成功(复选框在选中时没有检查)。

我真的很感激如何显示所选文本而不是复选框选择的索引,并希望知道我哪里出错。

以下是2个屏幕的Java和XML代码..

Java编码 - 屏幕1

package com.allmycode.lists;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.LinearLayout;

public class MainActivity extends Activity {
  static CheckBox[] checkBoxes = new CheckBox[18];

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

LinearLayout layout = 
    (LinearLayout) findViewById(R.id.linearLayout);
for (int i = 0; i < 18; i++) {
  checkBoxes[i] = new CheckBox(this);
  layout.addView(checkBoxes[i]);
}
checkBoxes[0].setText("Baking Ingredients");
checkBoxes[1].setText("Beverages");
checkBoxes[2].setText("Canned Foods");
checkBoxes[3].setText("Cereal");
checkBoxes[4].setText("Dairy");
checkBoxes[5].setText("Detergents");
checkBoxes[6].setText("Frozen Vegetables");
checkBoxes[7].setText("Fruit");
checkBoxes[8].setText("Broad Beans");
checkBoxes[9].setText("Herbs");
checkBoxes[10].setText("Legumes");
checkBoxes[11].setText("Meat");
checkBoxes[12].setText("Pasta");
checkBoxes[13].setText("Pet Food");
checkBoxes[14].setText("Rice");
checkBoxes[15].setText("Snacks");
checkBoxes[16].setText("Toiletries");
checkBoxes[17].setText("Vegetables");
}

  public void onShowListClick(View view) {
   Intent intent =
    new Intent(this, MyListActivity.class);
   startActivity(intent);
 }
}

XML编码 - 屏幕1

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android=

  "http://schemas.android.com/apk/res/android"
android:id="@+id/linearLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >
</TextView>

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="onShowListClick"
    android:text="@string/show_list" >
</Button>

Java编码 - 屏幕2

package com.allmycode.lists;

import java.util.ArrayList;

import android.app.ListActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;

public class MyListActivity extends ListActivity {

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

ArrayList<Integer> listItems =
    new ArrayList<Integer>();

for (int i = 0; i < 18; i++) {
  if (MainActivity.checkBoxes[i].isChecked()) {
      listItems.add(i);
  }
}

setListAdapter(new ArrayAdapter <Integer> (this,
    R.layout.my_list_layout, listItems));
}
}

XML编码 - 屏幕2

<?xml version="1.0" encoding="utf-8"?>

<TextView xmlns:android=
  "http://schemas.android.com/apk/res/android"
android:id="@+id/identView"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TextView>

2 个答案:

答案 0 :(得分:0)

您只需设置索引,因此发生了什么事情是有道理的:

ArrayList<Integer> listItems = new ArrayList<Integer>(); // <-- List of Integers

for (int i = 0; i < 18; i++) {
  if (MainActivity.checkBoxes[i].isChecked()) {
      listItems.add(i); // <-- You're adding an integer to the List
  }
}

请改为尝试:

ArrayList<String> listItems = new ArrayList<String>(); // <-- List of Strings

for (int i = 0; i < 18; i++) {
  if (MainActivity.checkBoxes[i].isChecked()) {
      listItems.add(MainActivity.checkBoxes[i].getText()); // Set it to the text of the Checkbox, not the integer index in the loop
  }
}

setListAdapter(new ArrayAdapter<String> (this, R.layout.my_list_layout, listItems));

答案 1 :(得分:0)

如果您使用常规Java类,Guardanis的答案在技术上是正确的。然而,Android Activity类不是常规Java类。

永远不要尝试从任何其他应用组件访问一个Activity中的字段或方法。在某些情况下,可能工作但是这种方法会破坏Activity模型,如果继续沿着那条线继续,即假设Activity只是一个普通的Java类,那么指出你的应用会崩溃和燃烧。

正确执行操作的方法是在启动MyListActivity之前,使用MainActivity中的代码确定选中的复选框。然后,您需要将此信息作为Intent个附加内容传递给MyListActivity,或者将数据保存在SharedPreferences中或使用其他方式共享数据。