2017-10-29 28 views
1

用户报告我们的应用程序布局的特定区域停止响应点击(未点击按钮点击)。什么可能导致Android布局的特定区域停止响应按钮点击?

我们有几个键盘布局可以换入和换出。下面是我们如何做到这一点:

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加载到视图中时,用户可以点击大多数的按钮,但底部的按钮除外。因为keypad2稍高keypad1,我倾向于认为可能会发生此问题,因为布局调整大小后未正确更新,并且未收到触摸事件。

不用说,这对我们和我们的大部分用户来说都是完美的,我们还没有能够在我们拥有的任何模拟器或设备上重现问题。受影响的系统是运行Lollipop(Android 22)的三星Galaxy S5。我们已收到来自用户的应用截图,它看起来与我们期望的屏幕大小和分辨率完全相同。

我们做错了什么?我们如何解决它?

谢谢!

编辑:这里是相关的布局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> 
+0

这些键盘是否包裹到其他一些布局中?您隐藏了实际的键盘,但包装布局可能仍然在新的键盘之上。 – mihail

+0

谢谢@mihail,我已将XML布局添加到上述问题中。小键盘是同一父容器中的所有同级视图。 – eli

+0

可能是一个布局是在另一个之上,你可以尝试使用给布局的宽度和高度,以避免重叠? – Vishwa

回答

1

没有能够重现问题,我不能确信以下任何帮助,但这里是我的建议:

变化如何measure()被称为:要调用measure()这样的:

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

这转化为keypad2.measure(-1, -2)measure()被定义为(从documentation):

措施

无效措施(INT widthMeasureSpec, INT heightMeasureSpec)

这就是所谓找出一个观点应该多大。父级在宽度和高度参数中提供约束信息。

所以,你的设置和来电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()以确保其正确布置。

+0

感谢您的指示。我们已经部署了一个新版本,并希望能够确认它已经解决了这种情况。由于赏金时间已到,这似乎是唯一的实质性建议,我会将这些观点发给你。我会立即发布更新,只要我知道它是否有效。 – eli

+0

不幸的是,这并没有解决问题。无论如何感谢您的尝试! – eli