即使将其可见性设置为 GONE,Android View 仍会获得 OnClick()

Posted

技术标签:

【中文标题】即使将其可见性设置为 GONE,Android View 仍会获得 OnClick()【英文标题】:Android View is still getting OnClick() even by set its visibility to GONE 【发布时间】:2015-08-30 17:46:37 【问题描述】:

我知道关于这个问题的问题很少,但他们都在使用动画。我的活动中根本没有动画。我有一个 TextView,默认情况下是可见的,并且根据我在启动画面中获得的功能标志设置为 Gone。

这是我的 xml 文件:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/profile_layout"
    android:layout_
    android:layout_>

    <LinearLayout
        android:layout_
        android:layout_
        android:background="@drawable/profile_bg"
        android:gravity="center_horizontal"
        android:orientation="vertical"
        android:paddingTop="?android:actionBarSize">

    <TextView
            android:id="@+id/payments_btn"
            android:layout_
            android:layout_
            android:layout_margin="6dp"
            android:background="@drawable/profile_payment_bg"
            android:clickable="true"
            android:drawableLeft="@drawable/ic_profile_payment"
            android:drawablePadding="8dp"
            android:gravity="center_vertical"
            android:onClick="onClick"
            android:padding="8dp"
            android:text="Payment"
            android:textAppearance="?android:textAppearanceMedium"
            android:textColor="@android:color/white" />

...

    </LinearLayout>

</FrameLayout>

虽然我将 Clickable 和 OnClickListener 功能分别设置为 false 和 null,但即使我的付款按钮不可见,也会调用 OnClick() 功能:(

@Override
    protected void onCreate(final Bundle savedInstanceState)
    
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.activity_profile);

        this.mPayments = (TextView) findViewById(R.id.payments_btn);

        // Check if payment functionality available for the Passenger
        final PassengerFeatureResponse cachedFeature = FeatureResponse.fromJsonString(PreferenceUtils.getFeatureResponse(this));
        if (cachedFeature == null || !cachedFeature.isMade())
        
            this.mPayments.setVisibility(View.GONE);
            this.mPayments.setClickable(false);
            this.mPayments.setOnClickListener(null);
        
    

我什至尝试将可见性设置为从 xml 文件中消失,并将其设置为从代码中可见,但是功能相同:(

这可能是因为我从 xml 文件中定义了onClick 功能,如果我从代码中设置点击侦听器,我的问题将得到解决,但是,我正在寻找以这种方式解决问题。

任何建议将不胜感激。谢谢。

【问题讨论】:

如果将可见性设置为 GONE,则视图将从布局中完全删除。它甚至不占用任何空间。我首先确认这是否真的发生? (我认为它不可能点击甚至没有出现在屏幕上的东西) mPayments.setVisibility(View.GONE); 绰绰有余。它肯定会起作用。 谢谢大家,但正如您在以下链接中看到的那样,其他人也有同样的问题,***.com/questions/4728908/…。即使视图消失,我仍然可以单击该项目:( 【参考方案1】:

像这样在FrameLayout 上试试这个

  this.frameMain= (FrameLayout) findViewById(R.id.profile_layout);
       if (cachedFeature == null || !cachedFeature.isMade())
        
            this.mPayments.setVisibility(View.GONE);
            this.mPayments.setClickable(false);
            this.mPayments.setOnClickListener(null);
            this.frameMain.invalidate();
        

【讨论】:

不错的猜测 Nilesh,谢谢,但不幸的是没有工作 :( 基于我所知道的无效功能尝试重绘视图而不是更改视图的属性。【参考方案2】:

在这些行之后:

        this.mPayments.setVisibility(View.GONE);
        this.mPayments.setClickable(false);

添加这些行:

        this.mPayments.setFocusable(false);
        this.mPayments.setFocusableInTouchMode(false);

** 编辑 **

忽略可聚焦的 sn-p 并尝试像这样禁用视图:

         this.mPayments.setEnabled(false);

您可以检查视图是否可以接收点击事件以确保一切正常:

         this.mPayments.isClickable(); // Indicates whether this view reacts to click events or not.

如果上面显示为 false,那么它不应该对点击事件做出反应。

【讨论】:

感谢夏普,不幸的是没有工作:(虽然我的问题是关于 clic 能力而不是焦点。 感谢您花费您的时间,但不幸的是没有工作:( 您检查过view.isClickable() 是否返回true 吗?【参考方案3】:

当您使用onClick 模式时,您必须在您的类中实现的方法上定义一个View 作为参数。

也许您可以使用带有视图 ID 的 开关,然后检查 payments_btn 是否仍然可见并仅在可见时触发您的操作。

【讨论】:

以上是关于即使将其可见性设置为 GONE,Android View 仍会获得 OnClick()的主要内容,如果未能解决你的问题,请参考以下文章

当可见性设置为Gone或Visible时,如何排列线性布局?

Android:为啥要设置可见性(View.GONE);或 setVisibility(View.INVISIBLE);不工作

当没有要显示的文本时,将 textview 可见性设置为 GONE

从 GONE 到 VISIBLE 的 Android 可见性第一次不起作用

动画可见性模式,GONE 和 VISIBLE

更改组件可见性时 Android Studio 空对象引用错误