android虚拟键盘弹出遮挡登陆按钮问题的解决方法

Android虚拟键盘的弹起会遮挡住部分ui,虽然通过在清单文件中设置,可以随着虚拟键盘的弹出,布局往上推,但是面对登陆界面时,并没有太大的作用,这样就会导致用户体验不好;开发中既然出现了就的解决;先说先解决的思路:获取到屏幕的高度、虚拟键盘的高度,布局的高度,用屏幕的高度减去布局的高度,用高度差和虚拟键盘的高度进行对比;代码实现如下;

private LinearLayout logo_layout;
  private ImageView iv_logo;
  private int sh;
  private int layoutH;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    logo_layout=(LinearLayout) findViewById(R.id.logo_layout);
    iv_logo=(ImageView) findViewById(R.id.iv_logo);
    //获取屏幕的高度
    DisplayMetrics dm = new DisplayMetrics();
    WindowManager windowMgr = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
    windowMgr.getDefaultDisplay().getMetrics(dm);
    sh = dm.heightPixels;
    logo_layout.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

      // 当layout执行结束后回调此方法
      @Override
      public void onGlobalLayout() {
        logo_layout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        layoutH = logo_layout.getHeight();
      }
    });
    //当键盘弹起的时候用屏幕的高度减去布局的高度,同时获取到键盘的高度,用键盘的高度和剩余的高度做对比
    SoftKeyBoardListener.setListener(MainActivity.this, new OnSoftKeyBoardChangeListener() {

      @Override
      public void keyBoardShow(int height) {
        //键盘弹起回调
        int h=sh-layoutH;
        if(h>height){//高度大于键盘的高度
          setLayoutH(80);
        }else{
          //高度小于键盘的高度
          int resetH=Math.abs(height+layoutH-sh);
          setLayoutH(resetH);
        }
      }

      @Override
      public void keyBoardHide(int height) {
        //键盘隐藏回调
        setLayoutH(80);
      }
    });
  }
  /**
   * 重新设置布局高度
   */
  private void setLayoutH(int h){
    LinearLayout.LayoutParams layoutParams = (android.widget.LinearLayout.LayoutParams) iv_logo.getLayoutParams();
    layoutParams.topMargin=dip2px(MainActivity.this, h);
    iv_logo.setLayoutParams(layoutParams);
  }
  /**
   * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
   */
  public static int dip2px(Context context,float dpValue) {
    final float scale =context.getResources().getDisplayMetrics().density;
    return (int) (dpValue * scale + 0.5f);
  }
private View rootView;//activity的根视图
  int rootViewVisibleHeight;//纪录根视图的显示高度
  private OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener;

  public SoftKeyBoardListener(Activity activity) {
    //获取activity的根视图
    rootView = activity.getWindow().getDecorView();

    //监听视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变
    rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
      @Override
      public void onGlobalLayout() {
        //获取当前根视图在屏幕上显示的大小
        Rect r = new Rect();
        rootView.getWindowVisibleDisplayFrame(r);
        int visibleHeight = r.height();
        if (rootViewVisibleHeight == 0) {
          rootViewVisibleHeight = visibleHeight;
          return;
        }

        //根视图显示高度没有变化,可以看作软键盘显示/隐藏状态没有改变
        if (rootViewVisibleHeight == visibleHeight) {
          return;
        }

        //根视图显示高度变小超过200,可以看作软键盘显示了
        if (rootViewVisibleHeight - visibleHeight > 200) {
          if (onSoftKeyBoardChangeListener != null) {
            onSoftKeyBoardChangeListener.keyBoardShow(rootViewVisibleHeight - visibleHeight);
          }
          rootViewVisibleHeight = visibleHeight;
          return;
        }

        //根视图显示高度变大超过200,可以看作软键盘隐藏了
        if (visibleHeight - rootViewVisibleHeight > 200) {
          if (onSoftKeyBoardChangeListener != null) {
            onSoftKeyBoardChangeListener.keyBoardHide(visibleHeight - rootViewVisibleHeight);
          }
          rootViewVisibleHeight = visibleHeight;
          return;
        }

      }
    });
  }

  private void setOnSoftKeyBoardChangeListener(OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) {
    this.onSoftKeyBoardChangeListener = onSoftKeyBoardChangeListener;
  }

  public interface OnSoftKeyBoardChangeListener {
    void keyBoardShow(int height);

    void keyBoardHide(int height);
  }

  public static void setListener(Activity activity, OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) {
    SoftKeyBoardListener softKeyBoardListener = new SoftKeyBoardListener(activity);
    softKeyBoardListener.setOnSoftKeyBoardChangeListener(onSoftKeyBoardChangeListener);
  }

以上做了仔细说明了,运行效果如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2017-01-19

Android BadgeView红点更新信息提示示例代码

应用市场很多应用程序中都会看见一些数字红点提示的效果,如QQ.微信以及一些提示更新应用的APP,以达到更好的提示功能的应用,本文将介绍一开源控件的使用实现红点更新信息提示效果. 一.BadgeView常用方法介绍: 1.setBadgeCount(int):设置提醒数字 2.setBadgeGravity(Gravity):设置位置布局 3.setTargetView(View):设置提示控件对象 4.setTypeface():设置显示字体 5.setShadowLayer():设置字体阴影

Android 获取手机信息实例详解

Android 获取手机信息 应用信息:包名.版本号.版本名,手机是否有Root权限 手机信息:手机屏幕宽和高.当前可用内存大小.总内存大小.IMEI号.IESI号.手机型号.手机品牌.手机MacAdd.CPU型号.CPU频率 开门见山,以下是Java代码,XML只有一个TextView显示信息. package com.example.getphoneinfo; import java.io.BufferedReader; import java.io.File; import java.io

Android自定义控件实现icon+文字的多种效果

今天给大家带来一个很简单但是很常用的控件ButtonExtendM,在开发中我们经常会用到图片加文字的组合控件,像这样: 以上图片都是从微信上截取的.(暂时没有找到icon在下,文字在上的例子) 下面我们通过一个控件来实现上下左右全部的样式,只需改动一个属性值即可改变icon的位置,是不是很方便,先看下demo效果图: 没错上图的三种不同的样式都是通过同一个控件实现的,下面我们看下代码 第一步 自定义属性  在res/values/目录下新建attrs.xml文件, 添加如下属性 <attr n

Android编程实现自定义ProgressBar样式示例(背景色及一级、二级进度条颜色)

本文实例讲述了Android编程实现自定义ProgressBar样式.分享给大家供大家参考,具体如下: 效果图如下,本例中设置了第一级进度条和第二级进度条. 样式资源:progressbar_bg.xml,放在drawable文件夹下: <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/a

Android自定义控件实现底部菜单(下)

在app中经常会用到底部菜单的控件,每次都需要写好多代码,今天我们用到了前几篇博客里的控件来进一步封装底部菜单.先看效果图: 主要包括以下功能: 1 设置icon以及点击之后的icon 2 设置文字 3 设置文字颜色以及点击之后的文字颜色 4 设置未读数量.更多以及new 我们先看如何使用,然后再看如何实现的 1 在布局文件中引用MenuM <com.landptf.view.MenuM android:id="@+id/mm_bottom" android:layout_wid

Android编程获取设备MAC地址的实现方法

本文实例讲述了Android编程获取设备MAC地址的实现方法.分享给大家供大家参考,具体如下: /** * 获取设备的mac地址 * * @param ac * @param callback * 成功获取到mac地址之后会回调此方法 */ public static void getMacAddress(final Activity ac, final SimpleCallback callback) { final WifiManager wm = (WifiManager) ac .get

Android中获取资源 id 及资源 id 的动态获取

 Android中获取资源 id 及资源 id 的动态获取 我们平时获取资源是通过 findViewById 方法进行的,比如我们常在onCreate方法中使用这样的语句: btnChecked=(ImageView)findViewById(R.id.imgCheck); findViewById是我们获取layout中各种View 对象比如按钮.标签.ListView和ImageView的便利方法.顾名思义,它需要一个int参数:资源id. 资源id非常有用.Android回自动为每个位于r

Android Secret Code(输入字符弹出手机信息)详解

Android Secret Code 我们很多人应该都做过这样的操作,打开拨号键盘输入*#*#4636#*#*等字符就会弹出一个界面显示手机相关的一些信息,这个功能在Android中被称为android secret code,除了这些系统预置的secret code,我们也可以实现自己的secret code,而且实现起来非常简单. 要实现自己的secret code,只需要向系统注册一个Broadcast Receiver,不需要任何权限,如下所示: <receiver android:n

Android自动获取输入短信验证码库AutoVerifyCode详解

一.简介 Android的短信验证码自动输入库,内嵌自动申请权限,兼容性高,支持多项配置. 短信验证码长度 验证码类型(大写字母.小写字母.大小写字母.数字.数字字母) 短信内容过滤 发送者号码过滤 短信权限回调,失败重新操作等等 消息回调,可自行处理 Github地址: https://github.com/tpnet/AutoVerifyCode 二.使用 2.1 最简单的使用 适用在验证码为数字,而且验证码为4-6位. AutoVerifyCode.getInstance() .with(

js showModalDialog弹出窗口实例详解

showModalDialog:模式窗口, 一种很特别的窗口,当它打开时,后面的父窗口的活动会停止,除非当前的模式子窗口关闭了, 才能操作父窗口.在做网页Ajax开发时,我们应该有时会用到它来实现表单的填写, 或做类似网上答题的窗口. 它的特点是,传参很方便也很强大,可直接调用父窗口的变量和方法. 使用方法:  vReturnValue = window.showModalDialog(sURL [, vArguments] [,sFeatures]) 参数说明:  sURL--  必选参数,类

Android实现打开手机淘宝并自动识别淘宝口令弹出商品信息功能

Android开发实现打开手机淘宝,并自动识别淘口令,弹出商品信息,大家都遇到过被莫名其妙拉进一个微信群,然后群主开始发一些商品的链接,我们点击这个链接,会让我们复制一个口令(就像这个¥AzZK0hPyou5¥),当我们复制这个口令打开淘宝会自动弹出这个商品的信息.今天,就来和大家分享一下,这个需求是如何实现的. 1.首先我们需要后台帮助我们对接淘宝的商品接口,因为这个东西(¥AzZK0hPyou5¥)是淘宝提供的,我们要做的只是通过网络请求我们的后台,把这个口令拿到就行,至于后台是如何调用淘宝

Android仿微信支付密码弹出层功能

预览 使用 这个弹出层是一个DialogFragment,逻辑都封装在其内部,使用起来很简单: Bundle bundle = new Bundle(); bundle.putString(PayFragment.EXTRA_CONTENT, "提现:¥ " + 100.00); PayFragment fragment = new PayFragment(); fragment.setArguments(bundle); fragment.setPaySuccessCallBack(

Android仿淘口令复制弹出框功能(简答版)

上篇文章给大家介绍了Android实现打开手机淘宝并自动识别淘宝口令弹出商品信息功能,接下来通过本文给大家分享android简单版仿淘口令复制弹出框功能,希望对大家有所帮助! 使用Android系统的粘贴板管理服务及ClipboardManager通过addPrimaryClipChangedListener添加Listener来监听粘贴板的状态,很很简单的一个小功能~ 1.首先创建一个Service在后台运行: Intent intent = new Intent(this,MainServi

Android编程实现的EditText弹出打开和关闭工具类

本文实例讲述了Android编程实现的EditText弹出打开和关闭工具类.分享给大家供大家参考,具体如下: 需求: 使用代码实现Android的输入框EditText对键盘的关闭弹出的实现. 代码: /** * 打开键盘 * * @param editText 操作的输入框 */ public static void openKeyboard(EditText editText) { //设置可获得焦点 editText.setFocusable(true); editText.setFocu

Android自定义view仿iOS弹出框效果

本文实例为大家分享了Android自定义view仿iOS弹出框的具体代码,供大家参考,具体内容如下 运行效果图 自定义对话框的使用,仿照ios.从底部弹出,类似pop窗口.包括消息.图片.列表及对话框. 好了,用法都会,直接贴上代码 1.layout布局文件 view_actionsheet.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="ht

Android编程实现长按弹出选项框View进行操作的方法

本文实例讲述了Android编程实现长按弹出选项框View进行操作的方法.分享给大家供大家参考,具体如下: 长按弹出选项框View进行操作 主要代码解释 private void showPopWindows(View v) { /** pop view */ View mPopView = LayoutInflater.from(this).inflate(R.layout.popup, null); final PopupWindow mPopWindow = new PopupWindow

Android中自定义PopupWindow实现弹出框并带有动画效果

使用PopupWindow来实现弹出框,并且带有动画效果 首先自定义PopupWindow public class LostPopupWindow extends PopupWindow { public Lost lost; public void onLost(Lost lost){ this.lost = lost; } private View conentView; public View getConentView() { return conentView; } public L