您的位置:首页 > 其它

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

2014-05-08 14:06 471 查看
今天看到社区里面有人问关于如何检测软键盘的弹起和隐藏事件。正确处理好软键盘的弹起和隐藏可以大大提升应用的体验。这一点,“切客优惠”做的很好。



device-2012-02-23-231400.png (53.25 KB, 下载次数: 12)

下载附件
保存到相册

2012-2-23 23:20 上传



device-2012-02-23-231422.png (57.62 KB, 下载次数: 5)

下载附件
保存到相册

2012-2-23 23:20 上传

在软键盘弹起后,下面的分享内容自动隐藏,并且在titlebar上,显示签到按钮。这个是一个非常贴心的设计,用户体检大大提升。

这是被大家视为无解的难题,我给大家提供一种方法。

有图为证:



device-2012-02-23-223840.png (35.14 KB, 下载次数: 8)

下载附件
保存到相册

2012-2-23 22:48 上传

初始化页面



device-2012-02-23-223901.png (32.84 KB, 下载次数: 3)

下载附件
保存到相册

2012-2-23 22:48 上传

刀客优化版初始页



device-2012-02-23-225120.png (65.01 KB, 下载次数: 3)

下载附件
保存到相册

2012-2-23 22:52 上传

优化版键盘弹起



device-2012-02-23-223957.png (37.78 KB, 下载次数: 3)

下载附件
保存到相册

2012-2-23 22:48 上传

软键盘隐藏



device-2012-02-23-224010.png (29.83 KB, 下载次数: 3)

下载附件
保存到相册

2012-2-23 22:48 上传

嘿嘿,未优化版的钉子户



device-2012-02-23-224022.png (58.92 KB, 下载次数: 4)

下载附件
保存到相册

2012-2-23 22:48 上传

钉子户果然坚挺啊

下面谈谈偶的实现原理:

使用自定义布局,页面布局中包含ScrollVIew,在软键盘弹起后,布局的高度会发生改变,根据布局的高度来判断软键盘的状态。

view source

print?

01
package
com.ransj.keyboard;
02
 
03
import
android.content.Context;
04
import
android.util.AttributeSet;
05
import
android.util.Log;
06
import
android.widget.RelativeLayout;
07
 
08
public
class
KeyboardLayout
extends

RelativeLayout {
09
private
static
final
String TAG = KeyboardLayout.
class
.getSimpleName();
10
public
static
final
byte
KEYBOARD_STATE_SHOW = -
3
;
11
public
static
final
byte
KEYBOARD_STATE_HIDE = -
2
;
12
public
static
final
byte
KEYBOARD_STATE_INIT = -
1
;
13
private
boolean
mHasInit;
14
private
boolean
mHasKeybord;
15
private
int
mHeight;
16
private
onKybdsChangeListener mListener;
17
 
18
public
KeyboardLayout(Context context,AttributeSet attrs,
int

defStyle) {
19
super
(context,attrs, defStyle);
20
}
21
 
22
public
KeyboardLayout(Context context,AttributeSet attrs) {
23
super
(context,attrs);
24
}
25
 
26
public
KeyboardLayout(Context context) {
27
super
(context);
28
}
29
/**
30
* set keyboard state listener
31
*/
32
public
void
setOnkbdStateListener(onKybdsChangeListener listener){
33
mListener = listener;
34
}
35
@Override
36
protected
void
onLayout(
boolean

changed,
int
l,
int
t,

int
r,
int

b) {
37
super
.onLayout(changed,l, t,r,b);
38
if
(!mHasInit) {
39
mHasInit =
true
;
40
mHeight = b;
41
if
(mListener !=
null
) {
42
mListener.onKeyBoardStateChange(KEYBOARD_STATE_INIT);
43
}
44
}
else

{
45
mHeight = mHeight < b ? b : mHeight;
46
}
47
if
(mHasInit && mHeight > b) {
48
mHasKeybord =
true
;
49
if
(mListener !=
null
) {
50
mListener.onKeyBoardStateChange(KEYBOARD_STATE_SHOW);
51
}
52
Log.w(TAG,
"show keyboard......."
);
53
}
54
if
(mHasInit && mHasKeybord && mHeight == b) {
55
mHasKeybord =
false
;
56
if
(mListener !=
null
) {
57
mListener.onKeyBoardStateChange(KEYBOARD_STATE_HIDE);
58
}
59
Log.w(TAG,
"hide keyboard......."
);
60
}
61
}
62
 
63
public
interface
onKybdsChangeListener{
64
public
void
onKeyBoardStateChange(
int

state);
65
}
66
}
这个是自定义的布局,自定义布局可以继承各种常见布局。自定义布局有键盘状态改变监听器,可以通过注册监听器来监听软键盘状态。

view source

print?

01
<?xml version=
"1.0"

encoding=
"utf-8"
?>
02
<com.ransj.keyboard.KeyboardLayoutxmlns:android=
"http://schemas.android.com/apk/res/android"
03
   
android:id=
"@+id/keyboardLayout1"
04
   
android:layout_width=
"fill_parent"
05
   
android:layout_height=
"fill_parent"

>
06
 
07
   
<ScrollView
08
       
android:layout_width=
"fill_parent"
09
       
android:layout_height=
"fill_parent"
10
       
android:layout_alignParentLeft=
"true"
11
       
android:layout_alignParentTop=
"true"
12
       
android:fillViewport=
"true"

>
13
 
14
       
<LinearLayout
15
           
android:layout_width=
"fill_parent"
16
           
android:layout_height=
"wrap_content"
17
           
android:orientation=
"vertical"

>
18
 
19
           
<TextView
20
               
android:id=
"@+id/testone_tv"
21
               
android:layout_width=
"fill_parent"
22
               
android:layout_height=
"wrap_content"
23
               
android:background=
"#000000"
24
               
android:gravity=
"center"
25
               
android:text=
"软件盘弹起,我将消失!软键盘隐藏,我将回来!"
26
               
android:layout_weight=
"1.0"
27
               
android:textColor=
"#00ff00"
28
               
android:textStyle=
"bold"

/>
29
 
30
           
<EditText
31
               
android:id=
"@+id/testone_et"
32
               
android:layout_width=
"fill_parent"
33
               
android:layout_height=
"wrap_content"
></EditText>
34
       
</LinearLayout>
35
   
</ScrollView>
36
 
37
</com.ransj.keyboard.KeyboardLayout>
这个是优化页面的布局,从上面可以看出自定义布局的用法。

view source

print?

01
package
com.ransj.keyboard;
02
 
03
import
com.ransj.keyboard.KeyboardLayout.onKybdsChangeListener;
04
 
05
import
android.app.Activity;
06
import
android.os.Bundle;
07
import
android.view.View;
08
import
android.widget.TextView;
09
import
android.widget.Toast;
10
/**
11
*
12
*
13
*/
14
public
class
TestOne
extends

Activity{
15
 
16
       
@Override
17
       
protected

void
onCreate(Bundle savedInstanceState) {
18
               
super
.onCreate(savedInstanceState);
19
               
setContentView(R.layout.testone);
20
               
KeyboardLayoutmainView = (KeyboardLayout) findViewById(R.id.keyboardLayout1);
21
               
final

TextView tv = (TextView) findViewById(R.id.testone_tv);
22
               
mainView.setOnkbdStateListener(
new

onKybdsChangeListener() {
23
                       
24
                       
public

void
onKeyBoardStateChange(
int

state) {
25
                               
switch

(state) {
26
                               
case

KeyboardLayout.KEYBOARD_STATE_HIDE:
27
                                       

tv.setVisibility(View.VISIBLE);
28
                                       

Toast.makeText(getApplicationContext(),
"软键盘隐藏"
, Toast.LENGTH_SHORT).show();
29
                                       

break
;
30
                               
case

KeyboardLayout.KEYBOARD_STATE_SHOW:
31
                                       

tv.setVisibility(View.INVISIBLE);
32
                                       

Toast.makeText(getApplicationContext(),
"软键盘弹起"
, Toast.LENGTH_SHORT).show();
33
                                       

break
;
34
                               
}
35
                       
}
36
               
});
37
       
}
38
 
39
       
@Override
40
       
protected

void
onDestroy() {
41
               
super
.onDestroy();
42
       
}
43
 
44
       
@Override
45
       
protected

void
onPause() {
46
               
super
.onPause();
47
       
}
48
}
这个是优化页面的代码逻辑,通过注册监听器,来监听软键盘事件。在软键盘弹起时隐藏Textview,在软键盘隐藏时显示Textview。

附上源码:


KeyBoard.zip(67.5
KB, 下载次数: 1522)

2012-2-23 23:06 上传
点击文件名下载附件

下载积分: e币 -10 元

欢迎大家反馈交流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: