View setEnabled(false) 影响力

探讨了在特定场景下,视图设置为不可用时如何影响按键事件和触摸事件的处理过程,揭示了在视图被禁用时,如何通过判断视图标志位来屏蔽这些事件,并解释了其背后的原理。
@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();
		}
	}

可以看到setEnable(false) 将View的flag打上了DISABLED.

public boolean onKeyDown(int keyCode, KeyEvent event) {
..............................................................

		if (KeyEvent.isConfirmKey(keyCode)) {
			if ((mViewFlags & ENABLED_MASK) == DISABLED) {
				return true;
			}
...................................................................
	}

	public boolean onKeyUp(int keyCode, KeyEvent event) {
		if (KeyEvent.isConfirmKey(keyCode)) {
			if ((mViewFlags & ENABLED_MASK) == DISABLED) {
				return true;
			}
...................................................................
	}

	private boolean isHoverable() {
.................................................................
		if ((viewFlags & ENABLED_MASK) == DISABLED) {
			return false;
		}
....................................................................
	}

public boolean onTouchEvent(MotionEvent event) {
		final int viewFlags = mViewFlags;

		if ((viewFlags & ENABLED_MASK) == DISABLED) {
			if (event.getAction() == MotionEvent.ACTION_UP && (mPrivateFlags & PFLAG_PRESSED) != 0) {
				setPressed(false);
			}
............................................................
}

可以看到,Enable false 把key event和 touch event都屏蔽掉了。
Android 开发中,`setEnabled(false)` 用于使能控件,当设置为 `false` 时,表明禁用该控件,此控件将永远不会活动,不管设置为什么属性,都无效。这就相当于控件的总开关,只有总开关打开(`setEnabled(true)`),才能使用其他事件,如触摸、点击、按键、滑动等事件。当控件被禁用时,它将无法响应用户的操作,并且通常会以灰色显示,给用户一种不可用的视觉提示 [^1][^3]。 在编程场景中,`setEnabled(false)` 有多种应用。例如,在某些条件不满足时,禁用按钮以防止用户误操作。以下是一个简单的示例代码: ```java import android.os.Bundle; import android.view.View; import android.widget.Button; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private Button myButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myButton = findViewById(R.id.myButton); // 模拟条件不满足 boolean condition = false; if (!condition) { myButton.setEnabled(false); } } } ``` 在这个示例中,如果 `condition` 为 `false`,则按钮 `myButton` 会被禁用,用户无法点击它。 另外,在 `setButton` 方法中,`setEnabled(true)` 和 `setEnabled(false)` 用于实现保持图标点亮的效果。当点击一个按钮时,将当前点击的按钮禁用(`setEnabled(false)`),同时将上一个点击的按钮启用(`setEnabled(true)`),以此来区分当前激活的按钮 [^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值