Android Button在设置为View.VISIBLE后需要点击几下即可工作



我有一个按钮:

<Button
android:id="@+id/my_btn"
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="My Button"
android:textColor="@android:color/black"
android:textSize="20sp"
android:textStyle="bold" />

在我的活动中,我设置了一个点击监听器:

findViewById(R.id.my_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
handleButtonClick();
}
});

在我的代码中,我将按钮的可见性设置为View.INVSISBLE,然后再次设置回View.VISIBLE。当它从不可见变为可见并且我尝试单击它时,有时需要单击几次才能在 onclicklistener 实际接收事件之前。同时,每当我单击它并且没有任何反应时,logcat 每次都会记录以下内容:

D/ViewRootImpl@1b16f49[MainActivity]: ViewPostImeInputStage processPointer 0
D/ViewRootImpl@1b16f49[MainActivity]: mHardwareRenderer.destroy()#4
D/ViewRootImpl@1b16f49[MainActivity]: dispatchDetachedFromWindow
W/InputEventReceiver: Attempted to finish an input event but the input event 
receiver has already been disposed.
D/InputTransport: Input channel destroyed: fd=71

实际收到按钮单击事件后,对按钮的每次其他单击都会起作用,直到它变得不可见并再次恢复可见。

我应该怎么做才能确保始终接收和处理按钮单击事件?

根本原因是两个 xml 属性:android:focusable="true"android:focusableInTouchMode="true",这会导致按钮在触发其OnClickListener之前获得焦点,并且每次您将按钮View.INVISIBLE并再次设置回View.VISIBLE时,它都会失去焦点,因此奇怪的现象再次发生。

有关更多详细信息,请参阅 SO 问题。

解决方案实际上是我在应该关闭警报时隐藏了警报。

通过调用 alert.hide((,我让警报在几秒钟后自动消失,但这不会删除它们。因此,当焦点从我的主要活动中丢失时,焦点会回到隐藏的警报上,因此该按钮在我的主要活动上不起作用,直到我单击屏幕足够多的次数以消除所有隐藏的警报。

我更改了代码以调用alert.dismiss((,我不再有这个问题。

相关内容

最新更新