即使将其可见性设置为 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