android软键盘显示和隐藏Word格式文档下载.docx
《android软键盘显示和隐藏Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《android软键盘显示和隐藏Word格式文档下载.docx(10页珍藏版)》请在冰豆网上搜索。
private
static
int
count
=
0;
3.
4.
public
ResizeLayout(Context
context,
AttributeSet
attrs)
{
5.
super(context,
attrs);
6.
}
7.
8.
@Override
9.
protected
void
onSizeChanged(int
w,
h,
oldw,
oldh)
10.
super.onSizeChanged(w,
oldh);
11.
12.
Log.e("
onSizeChanged
"
+
count++,
=>
onResize
called!
w="
+w
h="
+h+"
oldw="
+oldw+"
oldh="
+oldh);
13.
14.
15.
16.
onLayout(boolean
changed,
l,
t,
r,
b)
17.
super.onLayout(changed,
b);
18.
onLayout
OnLayout
l="
l
t="
t
r="
r
b="
+b);
19.
20.
21.
22.
onMeasure(int
widthMeasureSpec,
heightMeasureSpec)
23.
super.onMeasure(widthMeasureSpec,
heightMeasureSpec);
24.
25.
onMeasure
widthMeasureSpec="
widthMeasureSpec
heightMeasureSpec="
26.
我们的布局设置为:
1.<
com.winuxxan.inputMethodTest.ResizeLayout
xmlns:
android="
id="
@+id/root_layout"
layout_width="
fill_parent"
layout_height="
orientation="
vertical"
>
<
EditText
wrap_content"
/>
LinearLayout
@+id/bottom_layout"
gravity="
bottom"
s
TextView
text="
@string/hello"
background="
#77777777"
27.
/LinearLayout>
28.<
/com.winuxxan.inputMethodTest.ResizeLayout>
AndroidManifest.xml的Activity设置属性:
windowSoftInputMode="
adjustResize"
运行程序,点击文本框,查看调试信息:
E/onMeasure6(7960):
=>
onMeasurecalled!
widthMeasureSpec=1073742144,heightMeasureSpec=1073742024
E/onMeasure7(7960):
widthMeasureSpec=1073742144,heightMeasureSpec=1073742025
E/onSizeChanged8(7960):
onSizeChangedcalled!
w=320,h=201,oldw=320,oldh=377
E/onLayout9(7960):
OnLayoutcalled!
l=0,t=0,r=320,b=201
从调试结果我们可以看出,当我们点击文本框后,根布局调用了onMeasure,onSizeChanged和onLayout。
实际上,当设置为adjustResize后,软键盘弹出时,要对主窗口布局重新进行measure和layout,而在layout时,发现窗口的大小发生的变化,因此调用了onSizeChanged。
从下图的运行结果我们也可以看出,原本在下方的TextView被顶到了输入法的上方。
模式二,平移模式
windowSoftInputMode的值如果设置为adjustPan,那么该Activity主窗口并不调整屏幕的大小以便留出软键盘的空间。
相反,当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分。
这个通常是不期望比调整大小,因为用户可能关闭软键盘以便获得与被覆盖内容的交互操作。
上面的例子中,我们将AndroidManifest.xml的属性进行更改:
windowSoftInputMode="
adjustPan"
重新运行,并点击文本框,查看调试信息:
E/onMeasure6(8378):
widthMeasureSpec=1073742144,heightMeasureSpec=1073742200
E/onMeasure7(8378):
widthMeasureSpec=1073742144,heightMeasureSpec=1073742201
E/onLayout8(8378):
l=0,t=0,r=320,b=377
我们看到:
系统也重新进行了measrue和layout,但是我们发现,layout过程中onSizeChanged并没有调用,这说明输入法弹出前后并没有改变原有布局的大小。
从下图的运行结果我们可以看到,下方的TextView并没有被顶到输入法上方。
事实上,当输入框不会被遮挡时,该模式没有对布局进行调整,然而当输入框将要被遮挡时,窗口就会进行平移。
也就是说,该模式始终是保持输入框为可见。
如下图,整个窗口,包括标题栏均被上移,以保证文本框可见。
模式三自动模式
当属性windowSoftInputMode被设置为adjustUspecified时,它不被指定是否该Activity主窗口调整大小以便留出软键盘的空间,或是否窗口上的内容得到屏幕上当前的焦点是可见的。
系统将自动选择这些模式中一种主要依赖于是否窗口的内容有任何布局视图能够滚动他们的内容。
如果有这样的一个视图,这个窗口将调整大小,这样的假设可以使滚动窗口的内容在一个较小的区域中可见的。
这个是主窗口默认的行为设置。
也就是说,系统自动决定是采用平移模式还是压缩模式,决定因素在于内容是否可以滚动。
三、侦听软键盘的显示隐藏
有时候,借助系统本身的机制来实现主窗口的调整并非我们想要的结果,我们可能希望在软键盘显示隐藏的时候,手动的对布局进行修改,以便使软键盘弹出时更加美观。
这时就需要对软键盘的显示隐藏进行侦听。
直接对软键盘的显示隐藏侦听的方法本人没有找到,如果哪位找到的方法请务必告诉本人一声。
还有本方法针对压缩模式,平移模式不一定有效。
我们可以借助软键盘显示和隐藏时,对主窗口进行了重新布局这个特性来进行侦听。
如果我们设置的模式为压缩模式,那么我们可以对布局的onSizeChanged函数进行跟踪,如果为平移模式,那么该函数可能不会被调用。
我们可以重写根布局,因为根布局的高度一般情况下是不发生变化的。
假设跟布局为线性布局,模式为压缩模式,我们写一个例子,当输入法弹出时隐藏某个view,输入法隐藏时显示某个view。
OnResizeListener
mListener;
interface
OnResize(int
setOnResizeListener(OnResizeListener
l)
mListener
l;
if
(mListener
!
null)
mListener.OnResize(w,
24.}
在我们的Activity中,通过如下方法调用:
InputMethodTestActivity
Activity
final
BIGGER
1;
SMALLER
2;
MSG_RESIZE
HEIGHT_THREADHOLD
30;
InputHandler
Handler
handleMessage(Message
msg)
switch
(msg.what)
case
MSG_RESIZE:
(msg.arg1
==
BIGGER)
findViewById(R.id.bottom_layout).setVisibility(View.VISIBLE);
else
findViewById(R.id.bottom_layout).setVisibility(View.GONE);
break;
default:
super.handleMessage(msg);
28.
mHandler
new
InputHandler();
29.
30.
/**
Called
when
the
activity
is
first
created.
*/
31.
32.
onCreate(Bundle
savedInstanceState)
33.
super.onCreate(savedInstanceState);
34.
setContentView(R.layout.main);
35.
36.
layout
(ResizeLayout)
findViewById(R.id.root_layout);
37.
layout.setOnResizeListener(new
ResizeLayout.OnResizeListener()
38.
39.
40.
change
BIGGER;
41.
(h
42.
SMALLER;
43.
44.
45.
Message
msg
Message();
46.
msg.what
47.
msg.arg1
change;
48.
mHandler.sendMessage(msg);
49.
50.
});
51.
52.}
这里特别需要注意的是,不能直接在OnResizeListener中对要改变的View进行更改,因为OnSizeChanged函数实际上是运行在View的layout方法中,如果直接在onSizeChange中改变view的显示属性,那么很可能需要重新调用layout方法才能显示正确。
然而我们的方法又是在layout中调用的,因此会出现错误。
因此我们在例子中采用了Handler的方法。
本文出自“winux”博客,谢绝转载!