android:clickable=“false“无效,依然能被点击

android:clickable=“false”依然能被点击,该属性意义何在?

在Android中,android:clickable 属性用于指定一个视图(View)是否可以被点击。当你设置 android:clickable="true" 时,表示该视图可以接受点击事件;相反,如果设置为 android:clickable="false",则表示该视图不应该接收点击事件。

然而,即使你将 TextViewandroid:clickable 设置为 "false",如果你在代码中为这个 TextView 设置了点击事件监听器,它仍然会响应点击事件。这是因为在你给 TextView 添加了点击事件监听器之后,内部的点击状态会被改变以便能够接收并响应点击事件。

例如:

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Click Me!"
    android:clickable="false" />

然后在代码中:

TextView textView = findViewById(R.id.textView);
textView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 响应点击事件
    }
});

尽管XML中 clickable 被设置为 "false",但由于添加了点击事件监听器,TextView 还是可以响应点击操作。

从Android框架的设计角度来看,这样做是有意义的,因为开发人员可能想要有条件地控制视图的可点击性。比如,在某些情况下,你可能会在运行时根据业务逻辑改变 TextView 的点击响应。

android:clickable="true"android:clickable="false" 的主要区别是:

  • android:clickable="true":视图明确可以接受点击事件,通常用于没有设置点击监听器时标记视图为可点击的。
  • android:clickable="false":视图默认不接受点击事件,但如果在代码中设置了点击监听器,则视图仍然可以响应点击事件。

如果你不希望 TextView 在某些情况下响应点击事件,即使已经设置了点击监听器,你可以在代码中动态地设置 setClickable(false)。当你想让它再次响应点击时,设置 setClickable(true) 即可。

被覆盖,那么android:clickable="false意义何在?

android:clickable="false" 的设置通常用于以下场景:

  1. 默认不可点击:当你创建一个自定义视图或布局,并且默认情况下它不应该响应点击事件时,你可以在XML中明确地将 android:clickable 设置为 "false"。这样做可以清楚地表达出该视图的初始状态以及设计者的意图。

  2. 优化性能:对于不需要处理点击事件的视图,将其设置为不可点击可以避免在触摸事件分发过程中进行不必要的点击检查,从而轻微提升性能。

  3. 父子视图事件处理:在复杂的视图层次结构中,可能会有一些子视图默认不接受点击事件,因为点击事件被父视图处理了。例如,如果你有一个包含多个子项的布局,并且只有在特定条件下子项才应该接收点击事件,那么可以将子项的 android:clickable 默认设置为 "false" 并在需要的时候通过代码动态改变。

  4. 视觉效果:某些情况下,视图可能仅仅是用来显示信息,而不需要交互功能。通过设置 android:clickable="false" 可以确保即使后续在代码中不小心添加了点击事件监听器,该视图也不会显示点击效果(如水波纹),除非明确通过代码开启可点击状态。

android:clickable 设置为 "false" 在XML文件中的意义在于,它提供了一种声明式的方式来初始化视图的状态。虽然在代码中设置点击事件监听器会改变视图的可点击状态,但是XML文件中的设定有助于定义和理解视图的默认行为和布局的设计意图。

综上所述,android:clickable="false" 的设置更多是关于视图的初始状态和设计意图的说明,并且也有利于性能优化和事件处理策略。在实际开发中,你应该根据具体的场景和需求来决定是否需要在XML中显式设置此属性。

你可能感兴趣的:(Android,android)