kunyashaw博客主页 关注kunyashaw新博客 关于kunyashaw 转到底部

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、多总结,举一反三。

 

posted @ 2014-12-16 09:59  kunyashaw  阅读(1790)  评论(0编辑  收藏  举报
回到顶部