5、输入法弹出时布局错乱的解决方案
现在有这样一个布局:
1 <?xml version="1.0" encoding="utf-8"?> 2 3 <com.clientMenu.CustomScrollView 4 xmlns:android="http://schemas.android.com/apk/res/android" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 android:id="@+id/scrollview_new_from_history_menu" 8 > 9 10 <!-- android:fillViewport="true" --> 11 12 <RelativeLayout 13 android:layout_width="match_parent" 14 android:layout_height="match_parent" 15 android:id="@+id/relativeLayout_new_from_history_menu" 16 android:background="@drawable/blackboard"> 17 /> 18 19 </RelativeLayout> 20 21 22 23 </com.clientMenu.CustomScrollView>
1、在一个自定义的scrollView中加入一个相对布局
2、在程序跑起来的时候,又动态创建几个EditText
3、而且这几个输入框是支持拖拽的
现在问题来了,当我把输入框控件拖动到一个位置后,如果去编辑另一个输入框,那么当输入法弹出的时候,整个布局便又恢复移动前的样子,见下边的图:
1、初始时的截图
2、现在移动“西红柿牛腩饭”到另一个位置
3、当编辑“西红柿牛腩饭”的价格“24元”的时候,“西红柿牛腩饭”又回到之前的位置
那么为什么会出现这样的问题呢?我想了很久,把问题定位在以下几个点:
1、scrollView中对输入法的响应过程
2、输入法弹出的具体过程对布局的影响
3、activity中控件是如何显示在屏幕的
那么为什么要加入一个自定义的scrollView呢?一是为了在弹出输入法的时候,底部的控件不被输入法遮住;二是为了能够自由控制scrollView可否滚动。
输入法弹出是怎样一个过程呢?查了stackOverflow和google开发者文档都没有特别描述这个过程的。
接下来,我把重点放在了绘制布局的过程。在官网13.2节中是这样的解释的:
绘制布局又两个遍历过程组成:测量过程和布局过程
测量过程是由measure(int,int )方法来完成,该方法从上到下遍历视图树。在递归遍历中,每个视图都会向下层传递尺寸和规格。当measure方法遍历结束时,每个视图都保存了各自的尺寸信息
布局过程是由layout(int,int,int,int)方法完成,该方法也是由上而下遍历视图数,在遍历过程中,每个父视图通过测量过程的结果定位所有子视图的位置信息。
时隔一周再更新一下。
之前的方案都没有行的通,因为通过layout改变尺寸和位置信息后,没有找到通知父布局它的尺寸改变信息,所以我选用了另一种方案:通过弹出窗口(contextMenu)来修改文字内容
通过这张截图,可以看到输入法弹出的时候,没有改变scrollview的布局,所以就对整个relativeLayout的布局没有影响,在此基础上进行文字修改即可。
总结一下:
1、一种思维模式解决不了问题,要去换另一种思维模式来解决
2、多总结,举一反三。