android 自定义view setchecked 无效,android 自定义checkbox怪异事件(未完)

自定义的控件发生怪事,若有人知道麻烦告知下。

后来试验发现在onResume()方法中初始化siv选择状态,就没有这些问题。可能和activity生命周期有关。

自定义一个包含checkbox的控件。

控件布局:

控件源码:

public class SettingItemView extends LinearLayout { private TextView tv; private CheckBox cb;  public SettingItemView(Context context, AttributeSet attrs) { super(context, attrs); initView(context); String text = attrs.getAttributeValue("http://schemas.android.com/apk/res/com.mobilesecurity", "mytext"); tv.setText(text); }  public SettingItemView(Context context) { super(context); initView(context); }  private void initView(Context context) { this.setOrientation(LinearLayout.VERTICAL); View view = View.inflate(context, R.layout.item_setting, null); tv = (TextView) view.findViewById(R.id.tv_setting_item); cb= (CheckBox) view.findViewById(R.id.cb_setting_item); this.addView(view); }  public  boolean isChecked(){ return cb.isChecked(); }  public void setChecked(boolean checked){ //System.out.println(checked+"    "+",  cb ="+cb.toString()+",  SettingItemView = "+this.toString()); cb.setChecked(checked); } }

加入activity中

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_setting); sp = getSharedPreferences("config", Context.MODE_PRIVATE); siv_update = (SettingItemView) findViewById(R.id.siv_update_setting); siv_blacknumber = (SettingItemView) findViewById(R.id.siv_blacknumber_setting);  siv_update.setChecked(sp.getBoolean("update", false)); siv_blacknumber.setChecked(sp.getBoolean("black", false));  siv_update.setOnClickListener(new OnClickListener() {  @Override public void onClick(View v) { Editor ed = sp.edit(); if(siv_update.isChecked()){ //System.out.println("取消自动更新"); siv_update.setChecked(false); ed.putBoolean("update", false);  }else{ //System.out.println("开启自动更新"); siv_update.setChecked(true); ed.putBoolean("update", true); } ed.commit(); } });  siv_blacknumber.setOnClickListener(new OnClickListener() {  @Override public void onClick(View v) { Editor ed = sp.edit(); if(siv_blacknumber.isChecked()){ siv_blacknumber.setChecked(false); ed.putBoolean("black", false);  }else{ siv_blacknumber.setChecked(true); ed.putBoolean("black", true); } ed.commit(); } }); }

最小化该界面,在app管理中停止该应用。长按home键,重新打开该界面。会出现奇怪的现象。这两个复选框都选上了。但退出后再打开该界面又正确了。

很好奇,为什么会这样。我把自定义控件中setChecked()方法加入输出语句,发现没有问题,是一个false,一个true。但显示的界面还是两个都勾选上了。我又试了原生的CheckBox,是不会出现这种现象的。不知道为什么会出现这样的情况?

隐隐感觉可能是Activity在创建activity时候调用的我不知道的方法,修改了checkbox的状态。我想到onSaveInstanceState()和onRestoreInstanceState(),我把这个两个方法任意一个方法屏蔽了,竟然发现是对了。具体原理还不清楚。待以后深入学习android后,再说了。

protected void onSaveInstanceState(Bundle outState) { System.out.println("onSaveInstanceState : " + siv_blacknumber.toString() + "   " + siv_update.toString()); //super.onSaveInstanceState(outState); }

protected void onRestoreInstanceState(Bundle savedInstanceState) { System.out.println("onRestoreInstanceState : " + siv_blacknumber.toString() + "   " + siv_update.toString()); //super.onRestoreInstanceState(savedInstanceState); }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值