Android-->如何让普通View具有checked属性(背景xml支持checked状态)

当需要实现选择状态的时候,CompoundButton是系统提供的选择.

我们可以很简单的通过isChecked(), 返回是否选中.

也可以通过xml设置background的方法, 实现选中后的样式.


但是, 有些时候, 系统提供的控件不足以满足我们的需求,,,这个时候就是头脑风暴的时候了.


首先, 如果需要实现isChecked()返回是否选中, 那么自定义View的时候, 就需要自己通过一个变量
保存这个互斥状态值.

boolean mChecked = false;

这个通常是比较简单的.


难点:那么如何实现xml中的checked状态呢?
其实方法也很简单, 系统都处理好了, 只要我们调用就行.

//选中状态对应的系统资源
private static final int[] CHECKED_STATE_SET = {
        android.R.attr.state_checked
};

//重写View的onCreateDrawableState方法, 这个方法就是告诉xml当前的状态
//然后,系统会通过此状态,设置对应的drawable
@Override
public int[] onCreateDrawableState(int extraSpace) {
    //固定写法
    final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
    //判断是否选择
    if (isChecked()) {
        //如果选择, 把选择的状态, 合并到现有的状态中.
        mergeDrawableStates(drawableState, CHECKED_STATE_SET);
    }
    return drawableState;
}
public boolean isChecked() {
  return mChecked;
}

//那么, 当设置选中状态的时候
public void setChecked(boolean checked) {
  if (mChecked == checked) {
      return;
  }

  //保存当前的选中状态
  mChecked = checked;

  //固定写法, 刷新drawable的状态
  refreshDrawableState();
}

到这里, 你就可以显示一个和系统CompoundButton功能相同的控件了.


至此: 文章就结束了,如有疑问: QQ群:274306954 欢迎您的加入.

取消按钮依旧无反应而且跳转进页面依旧直接弹出添加任务的模态框 查看wxml是否也需要修改 <!-- pages/tomato/tomato.wxml --> <view class="container"> <!-- 顶部导航 --> <view class="header"> <text class="title">番茄TODO</text> <button class="settings-btn" bindtap="navigateToSettings">设置</button> </view> <!-- 任务列表 --> <view class="task-section"> <view class="section-title"> <text>今日任务</text> <text class="add-task" bindtap="showAddTaskModal">+ 添加</text> </view> <scroll-view scroll-y class="task-list"> <block wx:for="{{tasks}}" wx:key="id"> <view class="task-item {{currentTaskId === item.id ? 'active' : ''}}"> <checkbox checked="{{item.completed}}" bindtap="toggleTask" data-id="{{item.id}}"></checkbox> <text class="task-name">{{item.name}}</text> <text class="tomato-count">{{item.tomatoes}}/{{item.targetTomatoes}}</text> <button class="start-btn" bindtap="startTask" data-id="{{item.id}}" size="mini">开始</button> </view> </block> </scroll-view> </view> <!-- 计时器面板 --> <view class="timer-section"> <view class="timer-display"> <text class="timer">{{formattedTime}}</text> <text class="timer-state">{{timerState}}</text> </view> <view class="timer-controls"> <button class="control-btn {{!timerRunning ? 'primary' : ''}}" bindtap="startTimer" disabled="{{timerRunning}}"> {{timerRunning ? '运行中' : '开始'}} </button> <button class="control-btn" bindtap="pauseTimer" disabled="{{!timerRunning}}">暂停</button> <button class="control-btn" bindtap="resetTimer">重置</button> </view> <progress percent="{{progressPercent}}" stroke-width="6" activeColor="#FF5252" backgroundColor="#EEEEEE"/> </view> <!-- 统计信息 --> <view class="stats-section"> <view class="stat-item"> <text class="stat-value">{{completedTomatoesToday}}</text> <text class="stat-label">今日完成</text> </view> <view class="stat-item"> <text class="stat-value">{{completedTasksToday}}</text> <text class="stat-label">完成任务</text> </view> <view class="stat-item"> <text class="stat-value">{{totalFocusTime}}分钟</text> <text class="stat-label">专注时间</text> </view> </view> <!-- 添加任务模态框 --> <modal visible="{{showModal}}" title="添加新任务" confirm-text="添加" cancel-text="取消" bindconfirm="addTask" bindcancel="hideAddTaskModal"> <view class="modal-content"> <input placeholder="任务名称" bindinput="onTaskNameInput" value="{{newTaskName}}"/> <picker mode="selector" range="{{[1,2,3,4,5,6]}}" bindchange="onTargetTomatoesChange"> <view class="picker">目标番茄数: {{targetTomatoes || 1}}</view> </picker> </view> </modal> </view>
最新发布
05-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值