问题
在开发Android应用程序时,经常会有登录界面,无非是输入用户名、密码进行登录。当输入框获取焦点时,会弹出软键盘进行输入,如果输入框和登录按钮布局在整个布局文件的中间或靠下,势必会被软键盘遮挡,让人十分郁闷。网络上的解决方法无非也就那么三种:
第一、将登录框放在布局文件的顶端,软键盘不会遮挡;这种方案虽然能解决问题,但相当不灵活;
第二、在布局文件中根节点处加入ScrollView控件;
第三、这是我今天要讲的内容
首先,继承RelativeLayout,获取当前屏幕高度,实现onMesure、onSizeChanged方法;
其次,为自定义的Layout添加视图偏移的监听器
最后、在Activity当中实现监听
代码
- public class InputMethodRelativeLayout extends RelativeLayout {
- private int width;
- private int height;
- private int screenHeight;
- private boolean sizeChanged = false;
- private OnSizeChangedListener onSizeChangedListener;
- public InputMethodRelativeLayout(Context context, AttributeSet attrs,
- int defStyle) {
- super(context, attrs, defStyle);
- Display localDisplay = ((Activity)context).getWindowManager().getDefaultDisplay();
- screenHeight = localDisplay.getHeight();
- // TODO Auto-generated constructor stub
- }
- public InputMethodRelativeLayout(Context context, AttributeSet attrs) {
- super(context, attrs);
- // TODO Auto-generated constructor stub
- }
- public InputMethodRelativeLayout(Context context) {
- super(context);
- // TODO Auto-generated constructor stub
- }
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- // TODO Auto-generated method stub
- this.width = widthMeasureSpec;
- this.height = heightMeasureSpec;
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- }
- @Override
- protected void onSizeChanged(int w, int h, int oldw, int oldh) {
- // TODO Auto-generated method stub
- //监听不为空、宽度不变、当前高度与历史高度不为0
- if(this.onSizeChangedListener != null && w == oldw && h != 0 && oldh != 0){
- if(h >= oldh || (Math.abs(h - oldh) <= 1 * this.screenHeight / 4)){
- sizeChanged = false;
- }else if(h <= oldh || (Math.abs(h - oldh) <= 1 * this.screenHeight / 4)){
- sizeChanged = true;
- }
- this.onSizeChangedListener.onSizeChange(sizeChanged);
- measure(this.width - w + getWidth(), this.height - h + getHeight());
- }
- }
- /**
- * @Title: setOnSizeChangedListener
- * @Description: 为当前布局设置onSizeChanged监听器
- * @param sizeChangedListener
- * @return void
- */
- public void setOnSizeChangedListener(OnSizeChangedListener sizeChangedListener) {
- this.onSizeChangedListener = sizeChangedListener;
- }
- public abstract interface OnSizeChangedListener{
- public abstract void onSizeChange(boolean flag);
- }
在Activity中实现OnSizeChangedListener,原理是设置该布局的paddingTop属性来控制子View的偏移,如下:
- public class OALogin extends BaseActivity implements InputMethodRelativeLayout.OnSizeChangedListener{
- @InjectView(R.id.loginpage)
- private InputMethodRelativeLayout layout;
- @Inject
- private InputMethodManager inputMethodManager;
- private float density;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.login_page);
- getSupportActionBar().hide();
- density = getResources().getDisplayMetrics().density;
- layout.setOnSizeChangedListener(this);
- }
- @Override
- public void onSizeChange(boolean flag) {
- // TODO Auto-generated method stub
- if(flag){
- layout.setPadding(0, -159, 0, 0);
- }else
- layout.setPadding(0, 0, 0, 0);
- }
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- // TODO Auto-generated method stub
- if(event.getAction() == MotionEvent.ACTION_UP){
- inputMethodManager.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(),0);
- }
- return super.onTouchEvent(event);
- }
在AndroidManifest.xml中注册该Activity,需要注意的是:必须为该Activity设置android:windowSoftInputMode="adjustResize"属性,当windowSoftInputMode为adjustResiz时,Layout才会调用protected void onSizeChanged(int w, int h, int oldw, int oldh)这个方法。
俗话说,无图无真相,直接上图(借助了QQ2012的登录界面)
各位体会下吧!
相关推荐
在Android开发中,软键盘弹出时遮挡输入框是一个常见的问题,特别是在手机应用中,用户需要在有限的屏幕空间内进行输入操作。为了解决这个问题,开发者通常需要对布局进行特殊处理,确保输入框始终保持可见。下面...
在Android应用开发中,经常会遇到一个问题,即当用户在输入框中输入时,弹出的软键盘会遮挡部分屏幕内容,尤其是对于登录或注册等需要填写多项信息的界面,这种情况严重影响了用户体验。为了解决这个问题,Android...
总的来说,解决软键盘遮挡输入框的问题需要对Android布局机制有深入的理解,并可能涉及到自定义布局、监听键盘状态等多种技术。这个源码示例是一个很好的学习资源,可以帮助开发者提升在Android高级应用开发中的实践...
在Android开发中,软键盘遮挡输入框是一个常见的问题,特别是在设计底部弹出框或者聊天界面时。当用户点击输入框触发软键盘弹出时,由于屏幕空间有限,输入框可能会被键盘遮挡,影响用户体验。这个"Android高级应用...
默认情况下,Android系统会在软键盘弹出时调整布局,尝试将输入框移动到可见区域。然而,这并不总是完美地工作,尤其是在自定义布局或者有复杂嵌套视图的情况下。为了解决这个问题,我们可以采用以下几种策略: 1. ...
为了解决这个问题,我们可以自定义一个布局来处理这种现象,就像"Android解决软键盘遮挡输入框的示例代码"所展示的那样,通过重写LinearLayout来实现。 首先,我们要理解为什么会出现软键盘遮挡输入框的问题。这是...
总结来说,解决Android软键盘遮挡输入框的问题需要对Android布局和事件机制有深入理解,结合实际应用场景选择合适的方法。通过研究"安卓键盘输入相关-android解决软键盘遮挡输入框的示例代码.zip",开发者可以学习到...
Android 软键盘挡住输入框问题的终极解决方案 Android 软键盘挡住输入框问题是 Android 开发中一个经典的问题,特别是在使用 WebView 的情况下。这篇文章将详细介绍这个问题的成因、解决方案和最终的解决方法。 在...
1. **调整Activity布局**: 通过在AndroidManifest.xml中设置`android:windowSoftInputMode="adjustPan"`,可以让输入框平移以适应软键盘的出现,保持输入框可见。这种方式适用于输入框较小的情况,但当底部布局复杂...
在Android开发中,有时我们需要对软键盘的显示和隐藏状态进行监控,以便调整布局或实现特定功能。这个需求通常出现在创建聊天应用、编辑器或者其他需要根据输入法状态改变界面布局的场景。本篇文章将深入探讨如何在...
然而,当软键盘弹出时,布局不会自动适应键盘的高度,因此可能导致下方元素被遮挡。 解决软键盘遮挡登录按钮的方法主要有以下几种: 1. 使用`android:windowSoftInputMode="adjustResize"`: 在AndroidManifest....
Android软键盘挡住输入框问题的终极解决方案 Android开发中,软键盘挡住输入框是一个常见的问题,本文将详细讲解该问题的解决方案。 一、问题描述 在Android开发中,软键盘挡住输入框是一个非常常见的问题。这种...
另一种选择是`android:windowSoftInputMode="adjustResize"`,它会让整个布局缩小,以便为软键盘腾出空间,但可能会导致部分布局被键盘遮挡。 2. **自定义布局**: 创建一个自定义的全屏布局,监听键盘的显示与...
亲测可用,可以直接放到项目中进行使用 * 本来以为Actviity设置下android:windowSoftInputMode="adjustResize|...不行吧,我这边已经全部解决,键盘遮挡输入框,遮挡输入框下登录按钮,一 一解决了 简单操作,易扩展
Android系统在软键盘弹出或隐藏时会触发Activity的布局过程,我们可以通过监听这个过程来判断软键盘的状态。描述中提到的方法是通过重写`onLayout`方法来实现这一功能。 `onLayout`方法是View类的一个回调方法,它...
本文将深入探讨如何在Android平台上创建一个自定义的软键盘,主要基于系统提供的`Keyboard`类进行改造,涵盖键盘焦点效果的调整以及键盘布局的设计。 首先,理解Android中的软键盘实现原理至关重要。Android系统...
在移动应用开发中,尤其是Android或iOS平台,经常会遇到一个问题:当用户在界面中的一个输入框(EditText在Android,UITextField或UITextView在iOS)中输入时,弹出的虚拟软键盘可能会遮挡到下方的其他输入框或者...