`
shuai1234
  • 浏览: 971921 次
  • 性别: Icon_minigender_1
  • 来自: 山西
社区版块
存档分类
最新评论

Android手机软键盘遮盖输入框之重新布局详解

 
阅读更多

       在开发Android应用程序时,经常会有登录界面,无非是输入用户名、密码进行登录。当输入框获取焦点时,会弹出软键盘进行输入,如果输入框和登录按钮布局在整个布局文件的中间或靠下,势必会被软键盘遮挡,让人十分郁闷。网络上的解决方法无非也就那么三种:

第一、将登录框放在布局文件的顶端,软键盘不会遮挡;这种方案虽然能解决问题,但相当不灵活;

 

第二、在布局文件中根节点处加入ScrollView控件;

 

第三、这是我今天要讲的内容

 

首先,继承RelativeLayout,获取当前屏幕高度,实现onMesure、onSizeChanged方法;

 

其次,为自定义的Layout添加视图偏移的监听器

 

最后、在Activity当中实现监听

 

代码

 

[java] view plaincopy
 
  1. public class InputMethodRelativeLayout extends RelativeLayout {  
  2.     private int width;  
  3.       
  4.     private int height;  
  5.       
  6.     private int screenHeight;  
  7.       
  8.     private boolean sizeChanged = false;  
  9.       
  10.     private OnSizeChangedListener onSizeChangedListener;  
  11.       
  12.     public InputMethodRelativeLayout(Context context, AttributeSet attrs,  
  13.             int defStyle) {  
  14.         super(context, attrs, defStyle);  
  15.         Display localDisplay = ((Activity)context).getWindowManager().getDefaultDisplay();  
  16.         screenHeight = localDisplay.getHeight();  
  17.         // TODO Auto-generated constructor stub  
  18.     }  
  19.   
  20.     public InputMethodRelativeLayout(Context context, AttributeSet attrs) {  
  21.         super(context, attrs);  
  22.         // TODO Auto-generated constructor stub  
  23.     }  
  24.   
  25.     public InputMethodRelativeLayout(Context context) {  
  26.         super(context);  
  27.         // TODO Auto-generated constructor stub  
  28.     }  
  29.   
  30.     @Override  
  31.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  32.         // TODO Auto-generated method stub  
  33.         this.width = widthMeasureSpec;  
  34.         this.height = heightMeasureSpec;  
  35.         super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
  36.     }  
  37.   
  38.     @Override  
  39.     protected void onSizeChanged(int w, int h, int oldw, int oldh) {  
  40.         // TODO Auto-generated method stub  
[java] view plaincopy
 
  1. //监听不为空、宽度不变、当前高度与历史高度不为0  
  2. if(this.onSizeChangedListener != null && w == oldw && h != 0 && oldh != 0){  
[java] view plaincopy
 
  1.         if(h >= oldh || (Math.abs(h - oldh) <= 1 * this.screenHeight / 4)){  
  2.             sizeChanged = false;  
  3.         }else if(h <= oldh || (Math.abs(h - oldh) <= 1 * this.screenHeight / 4)){  
  4.             sizeChanged = true;  
  5.         }  
  6.         this.onSizeChangedListener.onSizeChange(sizeChanged);  
  7.         measure(this.width - w + getWidth(), this.height - h + getHeight());  
  8.     }  
  9. }  
  10.   
  11. /**  
  12. * @Title: setOnSizeChangedListener  
  13. * @Description: 为当前布局设置onSizeChanged监听器  
  14. * @param sizeChangedListener 
  15. * @return void  
  16. */   
  17. public void setOnSizeChangedListener(OnSizeChangedListener sizeChangedListener) {  
  18.     this.onSizeChangedListener = sizeChangedListener;  
  19. }  
  20.   
  21.   
  22. public abstract interface OnSizeChangedListener{  
  23.       
  24.     public abstract void onSizeChange(boolean flag);  
  25. }  

在Activity中实现OnSizeChangedListener,原理是设置该布局的paddingTop属性来控制子View的偏移,如下:

[java] view plaincopy
 
  1. public class OALogin extends BaseActivity implements InputMethodRelativeLayout.OnSizeChangedListener{  
  2.       
  3.     @InjectView(R.id.loginpage)  
  4.     private InputMethodRelativeLayout layout;  
  5.       
  6.     @Inject  
  7.     private InputMethodManager inputMethodManager;  
  8.     private float density;  
  9.     @Override  
  10.     protected void onCreate(Bundle savedInstanceState) {  
  11.         // TODO Auto-generated method stub  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.login_page);  
  14.         getSupportActionBar().hide();  
  15.         density = getResources().getDisplayMetrics().density;  
  16.         layout.setOnSizeChangedListener(this);  
  17.     }  
  18.   
  19.     @Override  
  20.     public void onSizeChange(boolean flag) {  
  21.         // TODO Auto-generated method stub  
  22.         if(flag){  
  23.             layout.setPadding(0, -15900);  
  24.         }else  
  25.             layout.setPadding(0000);  
  26.     }  
  27.   
  28.     @Override  
  29.     public boolean onTouchEvent(MotionEvent event) {  
  30.         // TODO Auto-generated method stub  
  31.         if(event.getAction() == MotionEvent.ACTION_UP){  
  32.             inputMethodManager.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(),0);  
  33.         }  
  34.         return super.onTouchEvent(event);  
  35.     }  


在AndroidManifest.xml中注册该Activity,需要注意的是:必须为该Activity设置android:windowSoftInputMode="adjustResize"属性,当windowSoftInputMode为adjustResiz时,Layout才会调用protected void onSizeChanged(int w, int h, int oldw, int oldh)这个方法。

 

俗话说,无图无真相,直接上图(借助了QQ2012的登录界面)

各位体会下吧!

分享到:
评论

相关推荐

    android解决软键盘遮挡输入框的示例代码

    在Android开发中,软键盘弹出时遮挡输入框是一个常见的问题,特别是在手机应用中,用户需要在有限的屏幕空间内进行输入操作。为了解决这个问题,开发者通常需要对布局进行特殊处理,确保输入框始终保持可见。下面...

    5种方法完美解决android软键盘挡住输入框方法详解

    在Android应用开发中,经常会遇到一个问题,即当用户在输入框中输入时,弹出的软键盘会遮挡部分屏幕内容,尤其是对于登录或注册等需要填写多项信息的界面,这种情况严重影响了用户体验。为了解决这个问题,Android...

    Android高级应用源码-android解决软键盘遮挡输入框的示例代码.zip

    总的来说,解决软键盘遮挡输入框的问题需要对Android布局机制有深入的理解,并可能涉及到自定义布局、监听键盘状态等多种技术。这个源码示例是一个很好的学习资源,可以帮助开发者提升在Android高级应用开发中的实践...

    Android高级应用源码-android解决软键盘遮挡输入框的示例代码.rar

    在Android开发中,软键盘遮挡输入框是一个常见的问题,特别是在设计底部弹出框或者聊天界面时。当用户点击输入框触发软键盘弹出时,由于屏幕空间有限,输入框可能会被键盘遮挡,影响用户体验。这个"Android高级应用...

    Android-键盘挡住输入框终极解决办法

    默认情况下,Android系统会在软键盘弹出时调整布局,尝试将输入框移动到可见区域。然而,这并不总是完美地工作,尤其是在自定义布局或者有复杂嵌套视图的情况下。为了解决这个问题,我们可以采用以下几种策略: 1. ...

    Android解决软键盘遮挡输入框的示例代码

    为了解决这个问题,我们可以自定义一个布局来处理这种现象,就像"Android解决软键盘遮挡输入框的示例代码"所展示的那样,通过重写LinearLayout来实现。 首先,我们要理解为什么会出现软键盘遮挡输入框的问题。这是...

    安卓键盘输入相关-android解决软键盘遮挡输入框的示例代码.zip

    总结来说,解决Android软键盘遮挡输入框的问题需要对Android布局和事件机制有深入理解,结合实际应用场景选择合适的方法。通过研究"安卓键盘输入相关-android解决软键盘遮挡输入框的示例代码.zip",开发者可以学习到...

    Android爬坑之旅:软键盘挡住输入框问题的终极解决方案.docx

    Android 软键盘挡住输入框问题的终极解决方案 Android 软键盘挡住输入框问题是 Android 开发中一个经典的问题,特别是在使用 WebView 的情况下。这篇文章将详细介绍这个问题的成因、解决方案和最终的解决方法。 在...

    Android软键盘与聊天页面底部布局之间优雅地切换

    1. **调整Activity布局**: 通过在AndroidManifest.xml中设置`android:windowSoftInputMode="adjustPan"`,可以让输入框平移以适应软键盘的出现,保持输入框可见。这种方式适用于输入框较小的情况,但当底部布局复杂...

    android监听软键盘状态

    在Android开发中,有时我们需要对软键盘的显示和隐藏状态进行监控,以便调整布局或实现特定功能。这个需求通常出现在创建聊天应用、编辑器或者其他需要根据输入法状态改变界面布局的场景。本篇文章将深入探讨如何在...

    Android 解决软键盘遮挡登陆按钮

    然而,当软键盘弹出时,布局不会自动适应键盘的高度,因此可能导致下方元素被遮挡。 解决软键盘遮挡登录按钮的方法主要有以下几种: 1. 使用`android:windowSoftInputMode="adjustResize"`: 在AndroidManifest....

    Android 爬坑之旅:软键盘挡住输入框问题的终极解决1

    Android软键盘挡住输入框问题的终极解决方案 Android开发中,软键盘挡住输入框是一个常见的问题,本文将详细讲解该问题的解决方案。 一、问题描述 在Android开发中,软键盘挡住输入框是一个非常常见的问题。这种...

    android软键盘把布局顶上去问题

    另一种选择是`android:windowSoftInputMode="adjustResize"`,它会让整个布局缩小,以便为软键盘腾出空间,但可能会导致部分布局被键盘遮挡。 2. **自定义布局**: 创建一个自定义的全屏布局,监听键盘的显示与...

    Android键盘挡住输入框

    亲测可用,可以直接放到项目中进行使用 * 本来以为Actviity设置下android:windowSoftInputMode="adjustResize|...不行吧,我这边已经全部解决,键盘遮挡输入框,遮挡输入框下登录按钮,一 一解决了 简单操作,易扩展

    Android判断软键盘是否弹出

    Android系统在软键盘弹出或隐藏时会触发Activity的布局过程,我们可以通过监听这个过程来判断软键盘的状态。描述中提到的方法是通过重写`onLayout`方法来实现这一功能。 `onLayout`方法是View类的一个回调方法,它...

    Android自定义软键盘

    本文将深入探讨如何在Android平台上创建一个自定义的软键盘,主要基于系统提供的`Keyboard`类进行改造,涵盖键盘焦点效果的调整以及键盘布局的设计。 首先,理解Android中的软键盘实现原理至关重要。Android系统...

    键盘遮挡输入框 界面多个输入框

    在移动应用开发中,尤其是Android或iOS平台,经常会遇到一个问题:当用户在界面中的一个输入框(EditText在Android,UITextField或UITextView在iOS)中输入时,弹出的虚拟软键盘可能会遮挡到下方的其他输入框或者...

Global site tag (gtag.js) - Google Analytics