客户端登录界面,根据输入框的弹出改变界面样式,解决键盘挡住输入框的问题

问题:
我们在开发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:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/loginpage"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <LinearLayout
        android:id="@+id/login_container"
        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:id="@+id/login_logo_layout_v"
            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:id="@+id/login_logoimg"
                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:id="@+id/login_logo_layout_h"
            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:id="@+id/qqId"
                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:id="@+id/uin_close"
                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:id="@+id/selectId"
                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:id="@+id/passWord"
                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:id="@+id/psw_close"
                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:id="@+id/login_btn"
            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:id="@+id/lineimg"
        android:layout_width="fill_parent"
        android:layout_height="1.0px"
        android:layout_above="@+id/reg_and_forget_password_layout"
        android:background="#ffcfcfcf" />

    <LinearLayout
        android:id="@+id/reg_and_forget_password_layout"
        android:layout_width="fill_parent"
        android:layout_height="49.0dip"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/forget_password_tv"
            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:id="@+id/reg_tv"
            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" >

代码下载地址:http://download.csdn.net/detail/catoop/7275579

时间: 2024-08-03 16:28:19

客户端登录界面,根据输入框的弹出改变界面样式,解决键盘挡住输入框的问题的相关文章

centos-Centos图形界面打开后无法弹出登录窗口

问题描述 Centos图形界面打开后无法弹出登录窗口 centos图形界面打开后无法弹出登录窗口 切换到命令窗口一直不停的显示 hub 5-0:1.0: over-current change on port 5hub 5-0:1.0: over-current change on port 6 求详细解决办法,菜鸟级别好多不懂的,望见谅..

为何登录 Windows XP Mode 时会弹出“账户受限、登录凭据错误”信息

故障现象: 登录 Windows XP Mode 时会弹出"账户受限.登录凭据错误"信息. 解决方案: 把 Windows XP Mode的登录密码留空了.登录时系统就弹出了报错信息:密码错误.账户受限!这怎么回事?   弹出的报错信息有两种:   第一种错误情况,如果之前对 Windows XP Mode 设置了账户密码并采用自动登录的方式,会出现提示"由于账户限制,您无法登录". 原因: 问题就出在这个留空的密码上! 其实,这是一个预期行为.系统对 Window

win7系统双击文件夹弹出搜索界面的解决方法

  其实win7系统一直很稳定,但时间久了必然会出现一定的问题,下面小编就为大家介绍一个不常出现,但是一旦出现又很麻烦的问题.win7旗舰版系统双击文件夹弹出搜索界面,这两个看似不可能同时出现的页面却出现在了一起.只有当右键打开才能正常打开文件夹阅读文件,这个情况的发生不是我们人为设置的,只有可能是我们无意中将右键菜单中多了一个搜索,而默认使用搜索打开导致的.我们只需要将默认使用打开文件就可以了.下面小编就来教大家这个方法. 解决双击文件夹弹出搜索界面的方法 1.打开注册表编辑器(在运行中输入

android执行安装命令时,怎么弹出安装界面,不要静默安装!

问题描述 android执行安装命令时,怎么弹出安装界面,不要静默安装! 静默安装没有用户体验,有点怪异! 我的pad执行pm install -r 时不弹出安装界面,但是我的手机可以弹出. 怎么在执行安装命令时弹出安装界面? 解决方案 检查下你的pad的设置,是不是它的系统是某个定制android系统? 解决方案二: 弹出安装界面与否是在你的android设备上设置的..比如小米手机:不让静默安装,需要你点击安装按钮进行安装.而锤子手机可以静默安装的., 不同的手机由于厂家的设置 不一样的..

android-新手求解,在登录页面判断登录成功后怎么在弹出框的“确定”实现跳转

问题描述 新手求解,在登录页面判断登录成功后怎么在弹出框的"确定"实现跳转 如图所示,不知道这个在哪里设置监听器,因为在 "判断输入的用户是否正确 "那边弹出框设置的,.setMessage("成功登录").setPositiveButton("确定",null).show();......之前class里边设置过监听器如ss,然后null就填ss,但好像不行,发现是两边没在一起.一个在class,一个在public Bool

安卓应用开发-安卓点击下拉按钮弹出编辑界面布局,这种布局叫什么名字

问题描述 安卓点击下拉按钮弹出编辑界面布局,这种布局叫什么名字 不是spinner那种.开发-安卓点击下拉按钮弹出编辑界面布局,这种布局叫什么名字-点击按钮弹出下拉菜单"> 解决方案 http://www.javaapk.com/source/6170.html

js-如何让用户第一次点击&amp;amp;lt;input&amp;amp;gt;输入框时弹出alert(&amp;amp;quot;A&amp;amp;quot;)?

问题描述 如何让用户第一次点击<input>输入框时弹出alert("A")? 当这个值为空时,用户点击进行输入时会弹出alert("A"),当用户输入值后,就不再弹出alert了 解决方案 在onfocus里面写 if ($(文本框id).val() == "") alert("A"); 解决方案二: <input type="text" onclick="if(this.va

如何在调用CAD,并在CAD中调用lisp时不弹出CAD界面?全部执行后再显示?

问题描述 如何在调用CAD,并在CAD中调用lisp时不弹出CAD界面?全部执行后再显示?我是这样做的AutoCAD.AcadApplicationClasscadApp=newAutoCAD.AcadApplicationClass(); //2004.2005Application.DoEvents();//cadApp.Documents.Application.Visible=true;//CAD成图cadApp.Documents.Open(sFileName,falseasobjec

ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)_javascript技巧

在使用ionic开发IOS系统微信的时候会有一个苦恼的问题,填写表单的时候键盘会挡住输入框,其实并不算什么大问题,只要用户输入一个字就可以立刻看见输入框了. 可惜的是,有些客户是不讲理的,他才不管这个问题,反正就是不行,所以在一天睡觉的时候突然惊醒,想出来这个方案. 我就不仔细讲代码了,直接上图 angular.module('MyApp') .directive('focusInput', ['$ionicScrollDelegate', '$window', '$timeout', '$io