问题
I am trying to set a OnCheckedChangeListener
to a CheckBox
but my application exits in the run time. I also tried to set listeners for my TextView
and I still get the same result. Can anyone help?
import android.app.ListActivity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class ListViewActivity extends ListActivity implements OnCheckedChangeListener {
TextView label;
CheckBox checkBox;
public class MyCustomAdapter extends ArrayAdapter<String> {
public MyCustomAdapter(Context context, int textViewResourceId,
String[] objects) {
super(context, textViewResourceId, objects);
// TODO Auto-generated constructor stub
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
//return super.getView(position, convertView, parent);
View row = convertView;
if(row==null){
LayoutInflater inflater=getLayoutInflater();
row=inflater.inflate(R.layout.main, parent, false);
}
label=(TextView)row.findViewById(R.id.weekofday);
label.setText(month[position]);
checkBox=(CheckBox)row.findViewById(R.id.checkBox);
return row;
}
}
String[] month = {
"January", "February", "March", "April",
"May", "June", "July", "August",
"September", "October", "November", "December"
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.main);
/*setListAdapter(new ArrayAdapter<String>(this,
R.layout.row, R.id.weekofday, DayOfWeek));*/
setListAdapter(new MyCustomAdapter(ListViewActivity.this, R.layout.main, month));
checkBox.setOnCheckedChangeListener(this); //my application exits here!!!!
}
@Override
public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
// TODO Auto-generated method stub
//Toast.makeText(getApplicationContext(), "box checked", Toast.LENGTH_LONG);
}
}
回答1:
You can't set the listener for your CheckBox
from the ListView
like that(it will probably throw a NullPointerException
), instead set the listener in the getView()
method(you'll also have to keep the CheckBox
status so you don't end up with strange rows status). Bellow is an example:
public class ListViewActivity extends ListActivity {
public class MyCustomAdapter extends ArrayAdapter<String> {
private ArrayList<Boolean> status = new ArrayList<Boolean>();
public MyCustomAdapter(Context context, int textViewResourceId,
String[] objects) {
super(context, textViewResourceId, objects);
for (int i = 0; i < objects.length; i++) {
status.add(false);
}
}
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
View row = convertView;
if (row == null) {
LayoutInflater inflater = getLayoutInflater();
row = inflater.inflate(R.layout.adapters_listviewactivity_row,
parent, false);
}
TextView label = (TextView) row.findViewById(R.id.weekofday);
label.setText(month[position]);
CheckBox checkBox = (CheckBox) row.findViewById(R.id.checkBox);
checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
Toast.makeText(getApplicationContext(), "" + position,
Toast.LENGTH_SHORT).show();
if (isChecked) {
status.set(position, true);
} else {
status.set(position, false);
}
}
});
checkBox.setChecked(status.get(position));
return row;
}
}
String[] month = { "January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December" };
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setListAdapter(new MyCustomAdapter(ListViewActivity.this,
R.layout.main, month));
}
}
For the TextView
you'll have to do the same thing.
回答2:
Implement CheckBox Listener for your class this way, especially if you have more than one CheckBox to deal with, you can handle in switch case blocks and makes your code neater:
public class MyClass extends AppCompatActivity implements
CompoundButton.OnCheckedChangeListener,{
CheckBox myCheckBox;
}
In your onCreate() method put this:
myCheckBox = (CheckBox)findViewById(R.Id.myCheckBoxName_in_XML_layout);
mmyCheckBox.setOnCheckedChangeListener(this);
Listern for your checkbox view event like this:
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
switch (buttonView.getId()){
case R.id.myCheckBoxName_in_XML_layout:
if(isChecked == true) {
Toast.makeText(this, "Checked", Toast.LENGTH_SHORT).show();
} else{
Toast.makeText(this, "Unchecked", Toast.LENGTH_SHORT).show();
}
break;
}
}
回答3:
public class MainActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener {
List<String> mList = new ArrayList<>();
CheckBox android, java, python, php, unity3D;
Button submitButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
android = (CheckBox) findViewById(R.id.androidCheckBox);
android.setOnCheckedChangeListener(this);
java = (CheckBox) findViewById(R.id.javaCheckBox);
java.setOnCheckedChangeListener(this);
python = (CheckBox) findViewById(R.id.pythonCheckBox);
python.setOnCheckedChangeListener(this);
php = (CheckBox) findViewById(R.id.phpCheckBox);
php.setOnCheckedChangeListener(this);
unity3D = (CheckBox) findViewById(R.id.unityCheckBox);
unity3D.setOnCheckedChangeListener(this);
submitButton = (Button) findViewById(R.id.submitButton);
submitButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.e("ArrayList Values*******",mList.toString());
}
});
}
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
switch (compoundButton.getId()) {
case R.id.androidCheckBox:
if (android.isChecked()) {
mList.add(String.valueOf(android.getText()));
Log.e("Android*******",mList.toString());
}
else {
mList.remove(android.getText());
}
break;
case R.id.javaCheckBox:
if (java.isChecked()) {
mList.add(String.valueOf(java.getText()));
Log.e("Java*******",mList.toString());
}
else {
mList.remove(java.getText());
}
break;
case R.id.phpCheckBox:
if (php.isChecked()) {
mList.add(String.valueOf(php.getText()));
Log.e("PHP*******",mList.toString());
}
else {
mList.remove(php.getText());
}
break;
case R.id.pythonCheckBox:
if (python.isChecked()){
mList.add(String.valueOf(python.getText()));
Log.e("Python*******",mList.toString());
}
else {
mList.remove(python.getText());
}
break;
case R.id.unityCheckBox:
if (unity3D.isChecked()){
mList.add(String.valueOf(unity3D.getText()));
Log.e("Unity*******",mList.toString());
}
else {
mList.remove(unity3D.getText());
}
break;
}
}
}
来源:https://stackoverflow.com/questions/10057328/cant-set-oncheckedchangelistener-to-a-checkbox