android 自定义checkbox怪异事件(未完)

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

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

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

控件布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:background="@drawable/item_setting_selector"
    android:layout_height="50dip" >
    
    <TextView
        android:id="@+id/tv_setting_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dip"
        android:layout_centerVertical="true"
        android:text="这是什么么功能"
        android:textSize="18sp" />

    <CheckBox
        android:id="@+id/cb_setting_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
         android:layout_marginRight="10dip"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:clickable="false"
        android:focusable="false"/>
    
    <View
        android:layout_marginLeft="5dip"
        android:layout_marginRight="5dip"
        android:layout_below="@id/cb_setting_item"
        android:layout_width="wrap_content"
        android:layout_height="1dip"
        android:background="#44000000"/>
</RelativeLayout>


控件源码:

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、付费专栏及课程。

余额充值