客戶端登錄界麵,根據輸入框的彈出改變界麵樣式,解決鍵盤擋住輸入框的問題
問題:我們在開發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