自定义view中利用onLayout判断键盘收起还是弹出

在android开发中控制软键盘是非常令人头疼的一件事,因为Android并没有开放出一个接口给开发者去简单易用的控制键盘的弹出与隐藏(这个时候就羡慕IOS的开发者们了。。。)。那假如说我有这么一个需求:我的界面中有一个输入框,我需要根据软键盘的状态来控制说,如果键盘弹出的话editText就显示为绿色,如果隐藏的话就显示为灰色。我怎么去控制它呢,今天想了一个简单的方法,试了也是可以的,不过有限制,但聊胜于无。发出来,有需要的可以带走。

思想就是重写onLayout方法,得到界面高度,这时候需要在AndroidManfest文件中设置activity
的 android:windowSoftInputMode="adjustResize" ,这样界面高度上才会有变化。

话不多说,上代码:

package com.example.testline;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.RelativeLayout;

public class AnimView extends RelativeLayout {

    private int tempBottom = 0;
    private int bottom = 0;
    private LayoutChangeListener listener;
    private boolean isFirstRun = true;

    public AnimView(Context context) {
        super(context);
    }

    public AnimView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

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

    public void setListener(LayoutChangeListener listener) {
        this.listener = listener;
    }

    public interface LayoutChangeListener {
        void keyboardClose();
        void keyboardOpen();
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        if (isFirstRun) {
            bottom = b;
        }
        if ((tempBottom - b) < 0) {
            System.out.println("关闭");
            listener.keyboardClose();
        } else if ((tempBottom - b) > bottom / 3) {
            System.out.println("展开");
            listener.keyboardOpen();
        }
        isFirstRun = false;
        tempBottom = b;
    }
}
public class MainActivity extends Activity implements LayoutChangeListener {

    private EditText et;
    private AnimView av;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et = (EditText) findViewById(R.id.et);
        av = (AnimView) findViewById(R.id.av);
        av.setListener(this);
    }

    @Override
    public void keyboardClose() {
        et.setBackgroundResource(R.color.yellow);
    }

    @Override
    public void keyboardOpen() {
        et.setBackgroundResource(R.color.red);
    }

}
<com.example.testline.AnimView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/av"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <EditText
        android:id="@+id/et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />

</com.example.testline.AnimView>

就这么简单,很好用,但是需要设置android:windowSoftInputMode="adjustResize" 。需要的可以带走。

作者原创,欢迎转载,转载请注明原地址

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-11 11:14:08

自定义view中利用onLayout判断键盘收起还是弹出的相关文章

H5页面在微信浏览器打开 ios 键盘收起后弹出层焦点错位

<input type="text" v-model="imgcode" @blur.prevent="changeCount()"> changeCount(){ window.scrollTo(0, 0); } 原文地址:https://www.cnblogs.com/zhizhic/p/10417451.html

自定义View(五),onLayout

转自http://blog.csdn.net/a396901990/article/details/38129669 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量——onMeasure():决定View的大小 2.布局——onLayout():决定View在ViewGroup中的位置 3.绘制——onDraw():如何绘制这个View. 而第3步的onDraw系统已经封装的很好了,基本不用我们来操心,只需要专注到1,2两个步骤就中好了. 第一步的测量,可以参考我之前的

自定义View 之利用ViewPager 实现画廊效果(滑动放大缩小)

自定义View 之利用ViewPager 实现画廊效果(滑动放大缩小) 转载请标明出处: http://blog.csdn.net/lisdye2/article/details/52315008 本文出自:[Alex_MaHao的博客] 项目中的源码已经共享到github,有需要者请移步[Alex_MaHao的github] 基本介绍 画廊在很多的App设计中都有,如下图所示: 该例子是我没事的时候写的一个小项目,具体源码地址请访问https://github.com/AlexSmille/Y

Android查缺补漏(View篇)--自定义 View 中 wrap_content 无效的解决方案

自定义 View 中 wrap_content 无效的解决方案 做过自定义 View 的童鞋都会发现,直接继承 View 的自定义控件需要重写 onMeasure() 方法,并设置 wrap_content 时的自身大小,否在在布局文件中对自定义控件在设置大小时,wrap_content 将等同于 match_parent. 其实在 Android 中自带的控件中,也都对 onMeasure() 方法进行了重写,对于 wrap_content 等情况做了特殊处理,在 wrap_content 时

关于Android自定义View中的onTouchEvent(MotionEvent event)事件监听

今天做一个自定义ViewGroup,通过addView动态添加子控件,为了省事,直接在父控件里重写public boolean onTouchEvent(MotionEvent event){}方法来监听当前触碰是哪个按钮,遇到点问题,所以写下来. 首先是点击效果只有 MotionEvent.ACTION_DOWN,这个把返回改为return true;就行了 然后是 getX()和getRawX()的区别,这个这篇博文有写到 http://www.cnblogs.com/foura/artic

Android 自定义view中的属性,命名空间,以及tools标签

昨日看到有人在知乎上问这3个琐碎的小知识点,今天索性就整理了一下,其实这些知识点并不难,但是很多开发者平时很少注意到这些, 导致的后果就是开发的时候 经常会被ide报错,开发效率很低,或者看开源代码的时候很多地方看不懂. 考虑到现在越来越多的人开发环境迁移到android studio,所以一切以android studio环境为准.和eclipse开发环境相比其实两者是差不多的, 偶有区别 主要也是android studio引入的gradle脚本造成差异. 首先来看看tools标签. 这个地

自定义View 中一些方法的调用时机

onFinishInflate()函数的调用时机: onFinishInflate() 当View中所有的子控件均被映射成xml后触发 onMeasure(int, int) 确定所有子元素的大小 onLayout(boolean, int, int, int, int) 当View分配所有的子元素的大小和位置时触发 onSizeChanged(int, int, int, int) 当view的大小发生变化时触发 onDraw(Canvas) view渲染内容的细节 onKeyDown(int

Android中实现Bitmap在自定义View中的放大与拖动

一:基本实现思路 基于View类实现自定义View –MyImageView类.在使用View的Activity类中完成OnTouchListener接口,实现对自定义View的触摸事件监听 放大与拖动 基于单点触控实现Bitmap对象在View上的拖动.并且检测View的边缘,防止拖动过界.基于两个点触控实现Bitmap对象在View上的放大.并且检测放大倍数.基于Matrix对象实现对Bitmap在View上放大与平移变换 Bitmap对象在View中的更新与显示 通过重载onDraw方法,

自定义view中自定义属性的用法.

有时候我们自定义的view需要用到有自己定义的属性. 首先定义自己的属性,在res/values/attrs.xml中定义,xml文件如下: <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name = "myView"> <attr name = "text" format = "s