【问题标题】:Can't set OnCheckedChangeListener to a Checkbox无法将 OnCheckedChangeListener 设置为复选框
【发布时间】:2012-04-20 21:19:41
【问题描述】:

我正在尝试将OnCheckedChangeListener 设置为CheckBox,但我的应用程序在运行时退出。我还尝试为我的TextView 设置侦听器,但我仍然得到相同的结果。有人可以帮忙吗?

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);

}


}

【问题讨论】:

    标签: android checkbox android-listview android-adapter


    【解决方案1】:

    你不能像这样从ListView 为你的CheckBox 设置监听器(它可能会抛出一个NullPointerException),而是在getView() 方法中设置监听器(你还必须保持CheckBox 状态,这样你就不会得到奇怪的行状态)。下面是一个例子:

    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));
        }
    
    }
    

    对于TextView,您必须做同样的事情。

    【讨论】:

      【解决方案2】:

      以这种方式为您的类实现 CheckBox 侦听器,特别是如果您有多个 CheckBox 需要处理,您可以在 switch case 块中处理并使您的代码更整洁:

       public class MyClass extends AppCompatActivity implements
          CompoundButton.OnCheckedChangeListener,{
      
            CheckBox myCheckBox;
        }
      

      在你的 onCreate() 方法中输入:

          myCheckBox = (CheckBox)findViewById(R.Id.myCheckBoxName_in_XML_layout);
          mmyCheckBox.setOnCheckedChangeListener(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;
              }
          }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多