View的 setClickable() 和 setEnabled()

1. setClickable

/**
 * Enables or disables click events for this view. When a view
 * is clickable it will change its state to "pressed" on every click.
 * Subclasses should set the view clickable to visually react to
 * user's clicks.
 *
 * @param clickable true to make the view clickable, false otherwise
 *
 * @see #isClickable()
 * @attr ref android.R.styleable#View_clickable
 */
public void setClickable(boolean clickable) {
	setFlags(clickable ? CLICKABLE : 0, CLICKABLE);
}

源码如上,当为false之后,控件不可点击是会往下面继续传递的。

但是,有个主要注意的,clickable设置点击事件之后,会变成true,如果需要取消点击事件则需要在设置完点击事件之后在设置为false。

/**
 * Register a callback to be invoked when this view is clicked. If this view is not
 * clickable, it becomes clickable.
 *
 * @param l The callback that will run
 *
 * @see #setClickable(boolean)
 */
public void setOnClickListener(@Nullable OnClickListener l) {
	if (!isClickable()) {
		setClickable(true);
	}
	getListenerInfo().mOnClickListener = l;
}

2. setEnabled()

/**
 * Set the enabled state of this view. The interpretation of the enabled
 * state varies by subclass.
 *
 * @param enabled True if this view is enabled, false otherwise.
 */
@RemotableViewMethod
public void setEnabled(boolean enabled) {
	if (enabled == isEnabled()) return;

	setFlags(enabled ? ENABLED : DISABLED, ENABLED_MASK);

	/*
	 * The View most likely has to change its appearance, so refresh
	 * the drawable state.
	 */
	refreshDrawableState();

	// Invalidate too, since the default behavior for views is to be
	// be drawn at 50% alpha rather than to change the drawable.
	invalidate(true);

	if (!enabled) {
		cancelPendingInputEvents();
	}
}

enabled与clickable的关系不大,当enabled设置为false之后按钮则不可点击,假如clickable设置为true消耗了点击事件,则事件不会在继续向下传递。

3. 总结

如果控件设置不可点击之后,想让底层的按钮可以点击使用clickable,反则用enabled。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值