是什么原因导致安卓布局的特定区域停止响应按钮点击



用户报告我们的应用程序布局的特定区域停止响应点击(按钮点击不会触发)。

我们有几种键盘布局可以互换。以下是我们的做法:

keypad1.setVisibility(RelativeLayout.GONE);
keypad2.setVisibility(RelativeLayout.VISIBLE);
keypad2.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
int newDimension = (int) (keypad2.getMeasuredHeight() + getResources().getDimension(R.dimen.keypad_toggle_button_height));
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) keypadContainer.getLayoutParams();
layoutParams.height = newDimension;
keypadContainer.setLayoutParams(layoutParams);

父布局具有android:animateLayoutChanges="true",因此此布局更改将平滑地设置动画。

用户可以访问keypad1上的所有按钮。当keypad2加载到视图中时,用户可以点击大多数按钮,布局底部的按钮除外。因为keypad2keypad1稍高,所以我倾向于认为,出现这个问题可能是因为布局在调整大小后没有正确更新,并且没有接收到触摸事件。

不用说,这对我们和我们的大部分用户来说都非常有效,我们还无法在我们拥有的任何模拟器或设备上重现这个问题。受影响的系统是三星Galaxy S5,运行棒棒糖(Android 22)。我们收到了用户的应用程序截图,它看起来与我们对屏幕大小和分辨率的期望完全相同。

我们做错了什么?我们如何进行故障排除?

谢谢!!!

EDIT:这是相关的布局XML片段。

<LinearLayout
android:id="@+id/keypad_container"
android:layout_width="match_parent"
android:layout_height="@dimen/keypad_toggle_button_height"
android:layout_alignParentBottom="true"
android:gravity="top"
android:orientation="vertical">
<View
android:id="@+id/toggle_button"
android:layout_width="match_parent"
android:layout_height="@dimen/keypad_toggle_button_height"
android:background="@drawable/toggle"
android:clickable="true"
android:onClick="toggleKeyboard"
/>
<com.app.views.KeyboardViewA
android:id="@+id/keypad_1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent">
</com.app.views.KeyboardViewA>
<com.app.views.KeyboardViewB
android:id="@+id/keypad_2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone">
</com.app.views.KeyboardViewB>
</LinearLayout>

如果不能重现问题,我不能确定以下任何一项是否会有所帮助,但以下是我的建议:

更改measure()的调用方式:您这样调用measure()

keypad2.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);

measure()定义为(来自文档):时,这转化为keypad2.measure(-1, -2)

测量

void measure(int widthMeasureSpec,int heightMeasureSpecifi)

调用此操作是为了确定视图的大小。父级在宽度和高度参数中提供约束信息。

因此,您的设置和对measure()的调用应该如下所示:

int layoutWidth = ((LinearLayout) (keypad2.getParent())).getWidth();
int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(layoutWidth, View.MeasureSpec.EXACTLY);
int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
keypad2.measure(widthMeasureSpec, heightMeasureSpec);

我不确定你的这种方式到底会发生什么,但由于它在大多数时候都是有效的,它可能没问题,也可能只是在某些情况下困扰你的东西。

我想到的另一件事是,你可能想尝试一下,那就是在你即将显示的键盘上调用forceLayout(),以确保它的布局正确。

最新更新