即使将Android View的可见性设置为GONE,仍然可以通过点击来触发OnClick()事件。

5

我知道有一些关于这个问题的问题,但是所有这些问题都使用了动画。在我的活动中,我根本没有任何动画。我有一个默认可见并且根据我在闪屏界面中获取的功能标志设置为隐藏的TextView。

这是我的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_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/profile_bg"
        android:gravity="center_horizontal"
        android:orientation="vertical"
        android:paddingTop="?android:actionBarSize">

    <TextView
            android:id="@+id/payments_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            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文件将可见性设置为Gone,然后从代码中将其设置为可见,但功能仍然相同 :(
这可能是因为我已经在XML文件中定义了onClick功能,如果我从代码中设置点击监听器,我的问题就会解决,但是,我希望以这种方式修复该问题。
任何建议将不胜感激。谢谢。

1
如果将可见性设置为GONE,则视图将完全从布局中删除。它甚至不占用任何空间。我首先要确认实际情况是否如此?(我认为无法单击根本没有显示在屏幕上的内容) - Shivam Verma
mPayments.setVisibility(View.GONE);足够了,它肯定能起作用。 - Neal Ahluvalia
1
谢谢,但正如您在以下链接中看到的那样,其他人也遇到了同样的问题:https://dev59.com/HW445IYBdhLWcg3wucio。即使视图已消失,我仍然可以单击该项目:( - Hesam
3个回答

0

尝试在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();
        }

2
不错的猜测,Nilesh,谢谢,但不幸的是没有起作用 :( 根据我所知,invalidate功能尝试重新绘制视图而不是更改视图的属性。 - Hesam

0

在这些行之后:

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

添加这些行:

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

** 编辑 **

请忽略focusable代码片段并尝试像这样禁用视图:

         this.mPayments.setEnabled(false);

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

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

如果上述条件为假,则不应对点击事件做出反应。

谢谢 Sharp,不幸的是没有奏效 :( 尽管我的问题与焦点相关,而不是可点击性。 - Hesam
谢谢你花时间帮忙,但不幸的是没有起作用 :( - Hesam
你是否检查过 view.isClickable() 是否返回 true? - Sharp Edge

0

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

也许您可以使用一个带有视图 ID 的 switch,然后检查是否仍然可见 payments_btn,并且只有在可见时才触发您的操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接