首页 > 代码库 > 5、输入法弹出时布局错乱的解决方案

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)方法完成,该方法也是由上而下遍历视图数,在遍历过程中,每个父视图通过测量过程的结果定位所有子视图的位置信息。

 

5、输入法弹出时布局错乱的解决方案