閱讀636 返回首頁    go 阿裏雲 go 技術社區[雲棲]


客戶端登錄界麵,根據輸入框的彈出改變界麵樣式,解決鍵盤擋住輸入框的問題

問題:
我們在開發Android應用中,登錄和注冊界麵是少不了的,往往在做登錄注冊的時候如果給界麵加一個LOGO,
就有可能把用戶名和密碼框放在手機屏幕的中間或底部,這樣當軟鍵盤彈出的時候,就有可能擋住輸入框(往往用戶輸完用戶名和密碼還要按返回鍵盤才能登錄),
這樣用戶體驗是不好的,該demo是一個解決該問題相對比較好的一個方法了。


效果圖對比




方法:

重寫RelativeLayout獲取當前屏幕高度,實現onMesure、onSizeChanged方法來實現。


直接上代碼(2個java類,1個布局文件):

package com.example.myrelativelayoutdemo1;

import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.Display;
import android.widget.RelativeLayout;

/**
 * 自定義布局解決鍵盤彈出擋住輸入框的問題
 * 
 */
public class InputMethodRelativeLayout extends RelativeLayout {

	private int width;
	protected OnSizeChangedListenner onSizeChangedListenner;
	private boolean sizeChanged = false; // 變化的標誌
	private int height;
	private int screenWidth; // 屏幕寬度
	private int screenHeight; // 屏幕高度

	public InputMethodRelativeLayout(Context paramContext, AttributeSet paramAttributeSet) {
		super(paramContext, paramAttributeSet);
		Display localDisplay = ((Activity) paramContext).getWindowManager().getDefaultDisplay();
		DisplayMetrics metrics = new DisplayMetrics();
		localDisplay.getMetrics(metrics);
		this.screenWidth = metrics.widthPixels;
		this.screenHeight = metrics.heightPixels;
	}

	public InputMethodRelativeLayout(Context paramContext, AttributeSet paramAttributeSet, int paramInt) {
		super(paramContext, paramAttributeSet, paramInt);
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		this.width = widthMeasureSpec;
		this.height = heightMeasureSpec;
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
	}

	@Override
	public void onSizeChanged(int w, int h, int oldw, int oldh) {
		// 監聽不為空、寬度不變、當前高度與曆史高度不為0
		if ((this.onSizeChangedListenner != null) && (w == oldw) && (oldw != 0) && (oldh != 0)) {
			if ((h >= oldh) || (Math.abs(h - oldh) <= 1 * this.screenHeight / 4)) {
				if ((h <= oldh) || (Math.abs(h - oldh) <= 1 * this.screenHeight / 4))
					return;
				this.sizeChanged = false;
			} else {
				this.sizeChanged = true;
			}
			this.onSizeChangedListenner.onSizeChange(this.sizeChanged, oldh, h);
			measure(this.width - w + getWidth(), this.height - h + getHeight());
		}
	}

	/**
	 * 設置監聽事件
	 * 
	 * @param paramonSizeChangedListenner
	 */
	public void setOnSizeChangedListenner(InputMethodRelativeLayout.OnSizeChangedListenner paramonSizeChangedListenner) {
		this.onSizeChangedListenner = paramonSizeChangedListenner;
	}

	/**
	 * 大小改變的內部接口
	 * 
	 * @author junjun
	 * 
	 */
	public abstract interface OnSizeChangedListenner {
		public abstract void onSizeChange(boolean paramBoolean, int w, int h);
	}
}

package com.example.myrelativelayoutdemo1;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;

import com.example.myrelativelayoutdemo1.InputMethodRelativeLayout.OnSizeChangedListenner;

public class MainActivity extends Activity implements OnSizeChangedListenner {

	private InputMethodRelativeLayout layout;
	private LinearLayout boot;
	private LinearLayout login_logo_layout_h;
	private LinearLayout login_logo_layout_v;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// 取得InputMethodRelativeLayout組件
		layout = (InputMethodRelativeLayout) this.findViewById(R.id.loginpage);
		// 設置監聽事件
		layout.setOnSizeChangedListenner(this);
		// 取得大LOGO布局
		login_logo_layout_v = (LinearLayout) this.findViewById(R.id.login_logo_layout_v);
		// 取得小LOGO布局
		login_logo_layout_h = (LinearLayout) this.findViewById(R.id.login_logo_layout_h);

		// 取得找回密碼和新注冊布局
		boot = (LinearLayout) this.findViewById(R.id.reg_and_forget_password_layout);

	}

	/**
	 * 在Activity中實現OnSizeChangedListener,原理是設置該布局的paddingTop屬性來控製子View的偏移
	 */
	@Override
	public void onSizeChange(boolean flag, int w, int h) {
		if (flag) {// 鍵盤彈出時
			layout.setPadding(0, -10, 0, 0);
			boot.setVisibility(View.GONE);
			login_logo_layout_v.setVisibility(View.GONE);
			login_logo_layout_h.setVisibility(View.VISIBLE);
		} else { // 鍵盤隱藏時
			layout.setPadding(0, 0, 0, 0);
			boot.setVisibility(View.VISIBLE);
			login_logo_layout_v.setVisibility(View.VISIBLE);
			login_logo_layout_h.setVisibility(View.GONE);
		}
	}
}

<?xml version="1.0" encoding="utf-8"?>
<com.example.myrelativelayoutdemo1.InputMethodRelativeLayout xmlns:andro
    android:
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <LinearLayout
        android:
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="vertical"
        android:paddingLeft="15.0dip"
        android:paddingRight="15.0dip" >
                <!-- 大logo -->
        <LinearLayout
            android:
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="34.0dip"
            android:layout_marginTop="43.0dip"
            android:orientation="vertical" >

            <ImageView
                android:
                android:layout_width="125.0dip"
                android:layout_height="125.0dip"
                android:adjustViewBounds="true"
                android:gravity="center"
                android:src="@drawable/ic_launcher" />

            <ImageView
                android:layout_width="125.0dip"
                android:layout_height="35.0dip"
                android:layout_marginTop="10.0dip"
                android:adjustViewBounds="true"
                android:gravity="center"
                android:src="@drawable/ic_launcher" />
        </LinearLayout>
                <!-- 小LOGO -->
        <LinearLayout
            android:
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="11.0dip"
            android:layout_marginTop="16.0dip"
            android:gravity="left|center"
            android:orientation="horizontal"
            android:visibility="gone" >

            <ImageView
                android:layout_width="42.0dip"
                android:layout_height="42.0dip"
                android:adjustViewBounds="true"
                android:gravity="center"
                android:src="@drawable/ic_launcher" />

            <ImageView
                android:layout_width="93.0dip"
                android:layout_height="30.0dip"
                android:layout_marginLeft="5.0dip"
                android:adjustViewBounds="true"
                android:src="@drawable/ic_launcher" />
        </LinearLayout>

        <FrameLayout
            android:layout_width="fill_parent"
            android:layout_height="45.0dip" >

            <EditText
                android:
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:hint="QQ號/手機號/郵箱"
                android:inputType="textEmailAddress"
                android:maxLength="50"
                android:paddingLeft="15.0dip"
                android:paddingRight="80.0dip"
                android:singleLine="true"
                android:text=""
                android:textColor="#ff000000"
                android:textColorHint="#ffbbbbbb"
                android:textSize="16.0dip" />

            <ImageView
                android:
                android:layout_width="30.0dip"
                android:layout_height="45.0dip"
                android:layout_gravity="right|center"
                android:layout_marginRight="40.0dip"
                android:background="@android:color/transparent"
                android:clickable="true"
                android:scaleType="center"
                android:src="@drawable/ic_launcher"
                android:visibility="invisible" />

            <ImageView
                android:
                android:layout_width="40.0dip"
                android:layout_height="45.0dip"
                android:layout_gravity="right|center"
                android:clickable="true"
                android:paddingLeft="5.0dip"
                android:paddingRight="15.0dip"
                android:scaleType="center"/>
        </FrameLayout>

        <FrameLayout
            android:layout_width="fill_parent"
            android:layout_height="45.0dip" >

            <EditText
                android:
                android:layout_width="fill_parent"
                android:layout_height="45.0dip"
                android:hint="密碼"
                android:inputType="textPassword"
                android:maxLength="16"
                android:paddingLeft="15.0dip"
                android:paddingRight="15.0dip"
                android:singleLine="true"
                android:textColor="#ff000000"
                android:textColorHint="#ffbbbbbb"
                android:textSize="16.0dip" />

            <ImageView
                android:
                android:layout_width="30.0dip"
                android:layout_height="45.0dip"
                android:layout_gravity="right|center"
                android:layout_marginRight="15.0dip"
                android:background="@android:color/transparent"
                android:clickable="true"
                android:scaleType="center"
                android:src="@drawable/ic_launcher"
                android:visibility="invisible" />
        </FrameLayout>

        <Button
            android:
            android:layout_width="fill_parent"
            android:layout_height="45.0dip"
            android:layout_marginTop="12.0dip"
            android:text="登 錄"
            android:textColor="#ffffffff"
            android:textSize="20.0dip" />
    </LinearLayout>

    <ImageButton
        android:
        android:layout_width="fill_parent"
        android:layout_height="1.0px"
        android:layout_above="@+id/reg_and_forget_password_layout"
        android:background="#ffcfcfcf" />

    <LinearLayout
        android:
        android:layout_width="fill_parent"
        android:layout_height="49.0dip"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:orientation="horizontal" >

        <Button
            android:
            android:layout_width="0.0dip"
            android:layout_height="fill_parent"
            android:layout_weight="1.0"
            android:autoLink="all"
            android:gravity="center"
            android:text="找回密碼"
            android:textColor="#ff666666"
            android:textSize="14.0dip" />

        <ImageButton
            android:layout_width="1.0px"
            android:layout_height="fill_parent"
            android:background="#ffcfcfcf" />

        <Button
            android:
            android:layout_width="0.0dip"
            android:layout_height="fill_parent"
            android:layout_weight="1.0"
            android:autoLink="all"
            android:gravity="center"
            android:text="新注冊"
            android:textColor="#ff666666"
            android:textSize="14.0dip" />
    </LinearLayout>

</com.example.myrelativelayoutdemo1.InputMethodRelativeLayout>

注意要在AndroidManifest.xml中增加配置屬性android:windowSoftInputMode="adjustResize",否則不會調用onSizeChanged方法,而且不能是全屏:

<activity
            android:name="com.example.myrelativelayoutdemo1.MainActivity"
            android:label="@string/app_name"
            android:windowSoftInputMode="adjustResize" >


代碼下載地址:https://download.csdn.net/detail/catoop/7275579



最後更新:2017-04-03 12:56:27

  上一篇:go 麵試經之一道淘汰85%麵試者的百度開發者麵試題
  下一篇:go 序號的結構層次順序