解决Android软键盘挡住登录按钮的问题!

本文介绍了在Android开发中如何处理软键盘弹出时遮挡登录按钮的问题,尝试了包括修改AndroidManifest.xml中Activity的软键盘模式,使用ScrollView,以及自定义ResizeLayout等多种解决方案,并提供了相关代码片段和最终效果展示。


最近在做公司项目的时候,要求登录的时候,软键盘不能挡住登录按钮,然后本人百度了半天,各种方法都试过了,尝试了各种失败,以下是网上大神们提供的几种方法的罗列:

  • 给Activity配置 android:windowSoftInputMode
  • 给布局套加上ScrollView
  • RelativeLayout,判断软键盘的显示和隐藏,做不同的动作
在多次尝试过之后,发现只是配置android:windowSoftInputMode无法实现我要的效果,最后我用了以下综合的方式解决了问题

AndroidManifest.xml

<activity android:name=".LoginActivity" 
                  android:windowSoftInputMode="adjustResize|stateHidden"
                  android:configChanges="keyboardHidden|orientation"></activity>

layout_login.xml

<?xml version="1.0" encoding="utf-8"?>
<com.android.demo.widget.ResizeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/new_login_root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/com_message_bg">
    
<ScrollView
        android:id="@+id/scroll"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:fillViewport="true" 
        android:scrollbars="none"
        android:fadingEdge="none">
 
    <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">    
    
           <!--登陆布局-->
    </LinearLayout>
</ScrollView>
</com.android.demo.widget.ResizeLayout>

ResizeLayout.java

public class ResizeLayout extends RelativeLayout{   
	private static final String TAG = ResizeLayout.class.getSimpleName();
	public static final byte KEYBOARD_STATE_SHOW = -3;
	public static final byte KEYBOARD_STATE_HIDE = -2;
	public static final byte KEYBOARD_STATE_INIT = -1;
	private boolean mHasInit;
	private boolean mHasKeybord;
	private int mHeight;
	private onKybdsChangeListener mListener;
	 
	public ResizeLayout(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		}
	
	public ResizeLayout(Context context, AttributeSet attrs) {
		super(context, attrs);
	}
	 
	public ResizeLayout(Context context) {
	super(context);
	}
	/**
	* set keyboard state listener
	*/
	public void setOnkbdStateListener(onKybdsChangeListener listener){
	mListener = listener;
	}
	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {
	super.onLayout(changed, l, t, r, b);
	if (!mHasInit) {
	mHasInit = true;
	mHeight = b;
	if (mListener != null) {
	mListener.onKeyBoardStateChange(KEYBOARD_STATE_INIT);
	}
	} else {
	mHeight = mHeight < b ? b : mHeight;
	}
	if (mHasInit && mHeight > b) {
	mHasKeybord = true;
	if (mListener != null) {
	mListener.onKeyBoardStateChange(KEYBOARD_STATE_SHOW);
	}
	Log.w(TAG, "show keyboard.......");
	}
	if (mHasInit && mHasKeybord && mHeight == b) {
	mHasKeybord = false;
	if (mListener != null) {
	mListener.onKeyBoardStateChange(KEYBOARD_STATE_HIDE);
	}
	Log.w(TAG, "hide keyboard.......");
	}
	}
	 
	public interface onKybdsChangeListener{
	public void onKeyBoardStateChange(int state);
	}
}
LoginActivity.java
ResizeLayout layout = (ResizeLayout) findViewById(R.id.new_login_root);

layout.setOnkbdStateListener(new onKybdsChangeListener() {
             public void onKeyBoardStateChange(int state) {
                     switch (state) {
                     //软键盘隐藏
                     case ResizeLayout.KEYBOARD_STATE_HIDE:
                           
                         break;
                     //软键盘弹起
                     case ResizeLayout.KEYBOARD_STATE_SHOW:
                    	 mhandler.post(new Runnable() {
                    		    @Override
                    		    public void run() {
                    		    	mScrollView.fullScroll(ScrollView.FOCUS_DOWN); 
                    		    }
                    		});
                         break;
                     }
             }
     });

最后附上效果图



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值