`

检测软键盘的弹起与隐藏【绝对经典,好用】

 
阅读更多
使用自定义布局,页面布局中包含ScrollVIew,在软键盘弹起后,布局的高度会发生改变,根据布局的高度来判断软键盘的状态。
转自:http://www.eoeandroid.com/thread-157446-1-1.html
1. 新建一个布局类KeyboardLayout
/**   
 * @文件名: KeyboardLayout.java 
 * @包 com.nhii.widget 
 * @描述: TODO(用一句话描述该文件做什么) 
 * @作者:MaLijun   
 * @创建时间 2013-12-15 上午10:16:37 
 * @版本 V1.0  
 */
package com.nhii.widget;

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

public class KeyboardLayout extends RelativeLayout {
	private static final String TAG = KeyboardLayout.class.getSimpleName();
	public static final byte KEYBOARD_STATE_SHOW = -3;
	public static final byte KEYBOARD_STATE_HIDE = -2;
	public static final byte KEYBOARD_STATE_INIT = -1;
	private boolean mHasInit;
	private boolean mHasKeybord;
	private int mHeight;
	private onKybdsChangeListener mListener;

	public KeyboardLayout(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

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

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

	/** * set keyboard state listener */
	public void setOnkbdStateListener(onKybdsChangeListener listener) {
		mListener = listener;
	}

	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {
		super.onLayout(changed, l, t, r, b);
		if (!mHasInit) {
			mHasInit = true;
			mHeight = b;
			if (mListener != null) {
				mListener.onKeyBoardStateChange(KEYBOARD_STATE_INIT);
			}
		} else {
			mHeight = mHeight < b ? b : mHeight;
		}
		if (mHasInit && mHeight > b) {
			mHasKeybord = true;
			if (mListener != null) {
				mListener.onKeyBoardStateChange(KEYBOARD_STATE_SHOW);
			}
			Log.w(TAG, "show keyboard.......");
		}
		if (mHasInit && mHasKeybord && mHeight == b) {
			mHasKeybord = false;
			if (mListener != null) {
				mListener.onKeyBoardStateChange(KEYBOARD_STATE_HIDE);
			}
			Log.w(TAG, "hide keyboard.......");
		}
	}

	public interface onKybdsChangeListener {
		public void onKeyBoardStateChange(int state);
	}
}


2. activity中
package com.nhii.ui;

import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.view.Window;
import android.widget.Toast;
import com.nhii.R;
import com.nhii.widget.KeyboardLayout;
import com.nhii.widget.KeyboardLayout.onKybdsChangeListener;
import com.ta.annotation.TAInjectView;

public class TestPageActivity extends BaseActivity {

	@TAInjectView(id = R.id.keyboardLayout1)
	KeyboardLayout mainView;
	
	@Override
	protected void onPreOnCreate(Bundle savedInstanceState) {
		super.onPreOnCreate(savedInstanceState);
		// 取消标题
		this.requestWindowFeature(Window.FEATURE_NO_TITLE);
		// 竖屏锁定
		this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
	}

	@Override
	protected void onAfterSetContentView() {
		super.onAfterSetContentView();
		mainView.setOnkbdStateListener(new onKybdsChangeListener() {
			public void onKeyBoardStateChange(int state) {
				switch (state) {
				case KeyboardLayout.KEYBOARD_STATE_HIDE:
					Toast.makeText(getApplicationContext(), "软键盘隐藏", Toast.LENGTH_SHORT).show();
					break;                                 
				case KeyboardLayout.KEYBOARD_STATE_SHOW:
					Toast.makeText(getApplicationContext(), "软键盘弹起", Toast.LENGTH_SHORT).show();
					break;
				}
			}
		}); 
	}
}


3. xml页面
<com.nhii.widget.KeyboardLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/keyboardLayout1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/light_pink"
    android:orientation="vertical" >
    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:fillViewport="true" >
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical" >
            <EditText
                android:id="@+id/testone_et"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="请输入..." />
        </LinearLayout>
    </ScrollView>
</com.nhii.widget.KeyboardLayout>
分享到:
评论

相关推荐

    监听软键盘弹出和隐藏

    在Android开发中,监听软键盘的弹出与隐藏是一个常见的需求,特别是在开发需要自适应界面布局的App时。Google并没有提供直接的API来监听软键盘的状态变化,因此开发者需要采用一些间接的方法。以下两种方法可以帮助...

    软键盘弹起隐藏的检测

    "软键盘弹起隐藏的检测"是一个关键的技术点,尤其是在开发Android应用时,因为Android系统的键盘行为并不总是直观或一致的。下面将详细讨论这个主题,以及如何通过代码来检测软键盘的状态。 首先,软键盘的弹起和...

    android中监听软键盘的弹出与隐藏,并获取软键盘的高度

    总的来说,监听Android软键盘的弹出与隐藏,以及获取软键盘高度,可以通过多种方式实现,开发者应根据具体需求选择合适的方法。同时,要注意兼容不同的`windowSoftInputMode`设置,以确保在各种情况下都能正确处理...

    监听软键盘的弹出与收起

    在Android开发中,软键盘的弹出与收起是一个常见的交互事件,对于界面布局和用户体验有着重要影响。本文将深入探讨如何在Android应用中监听软键盘的弹出与收起,以及实现这一功能的一些关键技术和策略。 首先,软...

    android 监听软键盘状态(弹起还是收起)

    下面将详细介绍如何在Android应用中监听软键盘的弹起与收起。 首先,我们需要理解Android布局高度的变化。当软键盘弹起时,屏幕可用的高度会减少,因为一部分空间被键盘占用;而当软键盘收起时,屏幕高度将恢复到...

    Android判断软键盘是否弹出

    在Android开发中,有时我们需要检测应用中的软键盘是否弹出,以便进行相应的界面调整或功能控制。例如,当用户打开虚拟键盘时,我们可能需要自动调整输入框的位置,或者在键盘隐藏时恢复原来的布局。标题“Android...

    android监听软键盘的弹出与隐藏的示例代码

    在Android开发中,软键盘的弹出与隐藏是一个常见的用户交互情景。由于软键盘占据了一部分屏幕空间,其弹出和隐藏会对界面布局产生影响。当软键盘弹出时,如果没有适当的监听机制,可能会导致用户界面上的内容被键盘...

    Android解决软键盘弹起时遮住登录按钮的问题

    在Activity的`onTouchEvent`方法中,如果检测到用户点击的不是EditText或其他需要输入的视图,就调用`InputMethodManager`关闭软键盘。 ```java @Override public boolean onTouchEvent(MotionEvent event) { if ...

    监听软键盘的弹出与收起(近乎完美的)

    在Android开发中,软键盘的弹出与收起是一个常见的需求,特别是在输入框交互和界面布局自适应时。本文将详细介绍三种实现软键盘监听的方法,帮助开发者选择最适合自己的方案。 一、方法一:使用InputMethodManager...

    editview软键盘自动弹出和隐藏

    总之,“editview软键盘自动弹出和隐藏”涉及了Android中对软键盘显示与隐藏的控制,这对于创建用户友好的输入界面至关重要。通过理解和实践这些技巧,开发者能够更好地定制他们的应用交互,提高用户体验。

    安卓监听软键盘输入法的弹起隐藏

    标题“安卓监听软键盘输入法的弹起隐藏”涉及到的关键技术点是Android系统的输入法管理以及如何在代码中监听这些变化。下面将详细介绍这个过程。 首先,理解Android输入法的工作原理。当用户在EditText控件上点击,...

    Android 设置一个底部控件view随着软键盘的弹出而上移

    通过监听`ViewTreeObserver.OnGlobalLayoutListener`,可以检测到视图树的全局布局变化,从而得知软键盘是否弹出。当键盘弹出时,可以手动调整底部视图的位置。 5. **使用第三方库**: 有一些开源库,如`android-...

    禁止软键盘弹出,自定义键盘

    此外,为了使自定义键盘与EditText交互更加顺畅,可能需要处理一些额外的细节,例如光标位置的控制、文本选择等。同时,还要考虑不同屏幕尺寸和方向的适配,以及如何优雅地处理输入法切换请求。 最后,如果应用需要...

    微信登录软键盘弹出后登录按钮自动弹起

    在Android开发中,微信登录页面的设计考虑了用户体验的细节,其中软键盘弹出时登录按钮自动弹起这一功能,是通过特定的技术手段实现的。这一现象背后涉及到Android系统的视图布局管理、输入法服务(IME)以及...

    Android监听软键盘弹出和收起事件

    监听Android软键盘弹出和收起事件(所有代码都是抽离自facebook/react-native源码中, 亲测有效, 放心食用)。回调事件方法参数包含键盘是否弹出(isShow)、键盘高度(keyboardHeight)、屏幕可用高度(screenHeight)、屏幕...

    登录按钮不被弹出软键盘覆盖

    例如,监听键盘的弹出和隐藏事件,当键盘弹出时,将登录按钮的位置手动调整到屏幕可视区域。Android提供了`KeyboardUtil`等第三方库帮助检测软键盘的状态,但这种方法需要更精细的布局管理和事件处理。 在仿QQ登录...

    监听Android系统软键盘的弹出与关闭(案例代码)

    从facebook React源码ReactRootView中抽离CustomGlobalLayoutListener,用于监听Android系统软键盘的弹出与关闭。 实现原理: 监听Android DecorView对应的GlobalLayout布局变化,从而判断是否弹出了软键盘。 其他...

    解决IOS端微信H5页面软键盘弹起后页面下方留白的问题

    前言:微信H5项目,ios端出现了软键盘输完隐藏后页面不会回弹,下方会有一大块留白 最近微信和ios都有版本升级,不知道是哪边升级造成的,但是经过测试,软键盘收起后,再滚动一下页面,下面的留白就会消失。所以...

    软键盘弹出动态改变UI布局

    总之,理解和掌握软键盘与UI布局的交互对于Android开发者来说非常重要,能够帮助我们创建更加用户友好的应用。通过监听布局变化和软键盘状态,我们可以灵活地调整界面,确保内容始终可见,提高用户体验。在实际项目...

    安卓点击空白区域和点击Editext以外的地方隐藏软键盘

    在Android开发中,用户界面的交互体验至关重要,其中包括如何有效地管理软键盘的显示与隐藏。在某些场景下,我们希望用户在点击EditText之外的任何地方或者点击屏幕空白区域时,能够自动隐藏软键盘,以提供更流畅的...

Global site tag (gtag.js) - Google Analytics