仿qq登录界面软键盘弹出时不覆盖登录注册按钮(获取软键盘高度)

参考:http://www.apkbus.com/android-177754-1-1.html

用到了里面的代码和资源


基本思路是:

1、将activity的软件盘弹出模式设置为android:windowSoftInputMode="adjustResize"

2、使用一个可以重叠的布局比如FrameLayout、RelativeLayout等,在布局底部放置一个充满屏幕的自定义布局,重写onSizeChanged方法,当高度变化超过100(认为超过100时是软件盘弹出或者隐藏的操作)时,调用接口回调方法,可以认为这个变化的高度就是软键盘的高度

3、计算你想要不被隐藏的按钮距离屏幕底端的位置,如果需要移动的话,调用view的scrollBy方法移动相应的距离


SoftKeyBoardSatusView.java,这个类用于判断软键盘是否弹出

public class SoftKeyBoardSatusView extends LinearLayout {

	private final int CHANGE_SIZE = 100;

	public SoftKeyBoardSatusView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}

	public SoftKeyBoardSatusView(Context context) {
		super(context);
		init();
	}

	private void init() {

	}

	@Override
	protected void onSizeChanged(int w, int h, int oldw, int oldh) {
		// TODO Auto-generated method stub
		super.onSizeChanged(w, h, oldw, oldh);
		Log.i("demo", "w :" + w);
		Log.i("demo", "h :" + h);
		Log.i("demo", "oldw :" + oldw);
		Log.i("demo", "oldh :" + oldh);

		if (oldw == 0 || oldh == 0)
			return;

		if (boardListener != null) {
			boardListener.keyBoardStatus(w, h, oldw, oldh);
			if (oldw != 0 && h - oldh < -CHANGE_SIZE) {
				boardListener.keyBoardVisable(Math.abs(h - oldh));
			}

			if (oldw != 0 && h - oldh > CHANGE_SIZE) {
				boardListener.keyBoardInvisable(Math.abs(h - oldh));
			}
		}
	}

	public interface SoftkeyBoardListener {
		public void keyBoardStatus(int w, int h, int oldw, int oldh);

		public void keyBoardVisable(int move);

		public void keyBoardInvisable(int move);
	}

	SoftkeyBoardListener boardListener;

	public void setSoftKeyBoardListener(SoftkeyBoardListener boardListener) {
		this.boardListener = boardListener;
	}
}

布局文件类似这样,主要就是放置一个SoftKeyBoardSatusView 充满布局,其余的一样:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#E6E6E6"
     >
     
    <com.example.test.SoftKeyBoardSatusView 
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/login_soft_status_view"
        >
        
    </com.example.test.SoftKeyBoardSatusView>
    
    <!-- <ScrollView 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:scrollbars="none"
        android:id="@+id/login_scroller"
        > -->
        <LinearLayout 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:id="@+id/login_layout"
        >
        <ImageView
            android:layout_width="75dp"
            android:layout_height="75dp"
            android:src="@drawable/default_head_icon"
            android:layout_gravity="center_horizontal"
            android:id="@+id/login_icon"
            android:layout_marginTop="100dp"
            />
    
        <LinearLayout 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/login_edit_bg"
            android:layout_marginLeft="20dp"
            android:layout_marginRight="20dp"
            android:layout_marginTop="5dp"
            android:paddingTop="10dp"
            android:orientation="vertical"
            >
        <RelativeLayout 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            >
            <EditText 
                android:layout_width="fill_parent"
                android:layout_height="45dp"
                android:background="@android:color/transparent"
                android:hint="请输入账号"
                android:paddingLeft="10dp"
                android:layout_marginRight="65dp"
                android:textColor="@android:color/black"
                android:gravity="center_vertical"
                android:singleLine="true"
                android:id="@+id/login_edit_account"
                android:textSize="18sp"
                />
            <ImageView 
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/arro_down"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:paddingRight="7dp"
                android:paddingTop="10dp"
                android:paddingBottom="10dp"
                android:paddingLeft="5dp"
                android:id="@+id/login_arrow"
                android:textSize="18sp"
                />
            <ImageView 
                android:layout_width="16dp"
                android:layout_height="16dp"
                android:src="@drawable/common_input_box_clear"
                android:layout_centerVertical="true"
                android:layout_toLeftOf="@id/login_arrow"
                android:id="@+id/login_account_edit_clear"
                android:layout_marginRight="2dp"
                />
        </RelativeLayout>
        
        <View 
            android:layout_width="fill_parent"
            android:layout_height="1px"
            android:background="@android:color/darker_gray"
            />
        
        <RelativeLayout 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            >
            <EditText 
                android:layout_width="fill_parent"
                android:layout_height="45dp"
                android:background="@android:color/transparent"
                android:hint="请输入密码"
                android:textColor="@android:color/black"
                android:paddingLeft="10dp"
                android:paddingRight="45dp"
                android:singleLine="true"
                android:id="@+id/login_edit_password"
                android:inputType="textPassword"
                android:layout_marginRight="65dp"
                android:textSize="18sp"
                android:gravity="center_vertical"
                />
            <ImageView 
                android:layout_width="16dp"
                android:layout_height="16dp"
                android:src="@drawable/common_input_box_clear"
                android:layout_centerVertical="true"
                android:layout_alignParentRight="true"
                android:layout_marginRight="5dp"
                android:id="@+id/login_password_edit_clear"
                />
        </RelativeLayout>
    </LinearLayout>
    
    <Button 
        android:layout_width="fill_parent"
        android:layout_height="45dp"
        android:background="@drawable/login_btn_selector"
        android:layout_marginTop="40dp"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:text="登 录"
        android:textColor="@android:color/white"
        android:textSize="22sp"
        android:textStyle="bold"
        android:id="@+id/login_login_btn"
        android:gravity="center"
        />
    <Button 
        android:layout_width="fill_parent"
        android:layout_height="45dp"
        android:background="@drawable/login_btn_selector"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginTop="20dp"
        android:layout_marginBottom="20dp"
        android:text="注 册"
        android:textColor="@android:color/white"
        android:textSize="22sp"
        android:textStyle="bold"
        android:id="@+id/login_register_btn"
        android:gravity="center"
        />
    </LinearLayout>
    <!-- </ScrollView> -->
    

</RelativeLayout>
然后就可以计算注册按钮button被覆盖的高度,让外层布局LinearLayout scrollBy这段距离。计算代码:

int scroll_dx;
int height = getWindowManager().getDefaultDisplay().getHeight();
int bottom = height - location[1] - button_register.getHeight();
scroll_dx = bottom > move ? 0 : move - bottom;
layout.scrollBy(0, scroll_dx);

当软件盘隐藏的时候,相应的移动回来就可以了。

简单效果图:

登录              登录2

整理后的代码下载




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值