Android软键盘弹出时把布局顶上去的解决方法

本文介绍了如何在Android应用中解决软键盘弹出时导致布局错位的问题。通过设置activity的windowSoftInputMode属性,可以避免软键盘弹出时顶起布局,并确保焦点元素始终可见。

    之前设置的各种方法,要么采用了相对布局,解决了控件在底部的问题, 但是软键盘会把控件顶上去,要么采用了清单文件中设置参数,结果,当editText获取焦点的时候, 点击外部区域关闭不了软键盘,等各种问题,自从找到了这篇文章所有的范罗都搞定了

原文:

解决Andriod软键盘出现把原来的布局给顶上去的方法(转)

链接:http://blog.sina.com.cn/s/blog_9564cb6e0101g2eb.html


决方法,在mainfest.xml中,对那个Activity加:

<activityandroid:name=".activity.HomeActivity"android:windowSoftInputMode="adjustPan|stateHidden"></activity>


就不会把原来Activity的布局给顶上去了。

 

%¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥

 

今天要做一个搜索功能,搜索界面采用AutoCompleteTextView做搜索条,然后下面用listview来显示搜索结果,而我的主界面是在底部用tab做了一个主界面导航,其中有一个搜索按钮,因为在搜索条中输入文字的时候会弹出软件盘,但是如果不做什么设置的话,软键盘弹出来的同时,会把我下面的tab导航给相应拉到屏幕的上面,界面显示的扭曲啊,后来找到一种解决方法,在相应的activity中(比如我这是tab的activity,用的是adjustpan)添加

android:windowSoftInputMode这个属性,下面详细说下这个属性:

& X! Q6c9 }% i. ]6 @0 Y" N6^   {"X

windowSoftInputMode属性设置值说明。

<activityandroid:windowSoftInputMode=["stateUnspecified",

                         "stateUnchanged", "stateHidden",

                         "stateAlwaysHidden", "stateVisible",

                         "stateAlwaysVisible","adjustUnspecified",

                         "adjustResize", " …… >

</activity>

attributes:

android:windowSoftInputMode

活动的主窗口如何与包含屏幕上的软键盘窗口交互。这个属性的设置将会影响两件事情7S7 U+ S! p7 s( U) n: t: m& N
:

1>   
软键盘的状态——是否它是隐藏或显示——当活动5w$ r- U9 i" h. O' M" M
(Activity)
成为用户关注的焦点。

2>   
活动的主窗口调整——是否减少活动主窗口大小以便腾出空间放软键盘或是否当活动窗口的部分被软键盘覆盖时它的内容的当前焦点是可见的。

它的设置必须是下面列表中的一个值,或一个
”state…”值加一个+ s. Z" m5 u: {; k; B7v4 Q
”adjust…”
值的组合。在任一组设置多个值——多个
”state…”values,例如&
mdash有未定义的结果。各个值之间用+H8 v$ Q# ~5 f3 B& `- G8 c$ y
|
分开。例如
:<activityandroid:windowSoftInputMode="stateVisible|adjustResize" . . .>

在这设置的值8A: N! L' x0 `: C
(
'H0 N" g, w2 W) K  F# y2 l!c
"stateUnspecified"

"adjustUnspecified"以外3 ^, p2E  G: I2 y/ V
)
将覆盖在主题中设置的值


将覆盖在主题中设置的值

描述

"stateUnspecified"

软键盘的状态
(是否它是隐藏或可见
)没有被指定。系统将选择一个合适的状态或依赖于主题的设置。这个是为了软件盘行为默认的设置。

"stateUnchanged"

软键盘被保持无论它上次是什么状态,是否可见或隐藏,当主窗口出现在前面时。

"stateHidden"

当用户选择该
Activity时,软键盘被隐藏——也就是,当用户确定导航到该# ^* {1 w. C: Y-}
Activity时,而不是返回到它由于离开另一个: }/ N! p( a* M% W. b%m9 b# u
Activity

"stateAlwaysHidden"

软键盘总是被隐藏的,当该
Activity主窗口获取焦点时。

"stateVisible"

软键盘是可见的,当那个是正常合适的时& d% G.y8 [; G; _: v
(当用户导航到" s2 I/ J$ s2 w7 J) j6O& J, f
Activity主窗口时
)

"stateAlwaysVisible"

当用户选择这个6 Z%C  e/ r0 u,M  `7N  r
Activity时,软键盘是可见的——也就是,也就是,当用户确定导航到该. m; r6 r% t. `# A4 C0^, t; d! V
Activity时,而不是返回到它由于离开另一个
Activity

"adjustUnspecified"

它不被指定是否该" H9 b! V3 h5_& O$ d$ M  B" V5j: d
Activity主窗口调整大小以便留出软键盘的空间,或是否窗口上的内容得到屏幕上当前的焦点是可见的。系统将自动选择这些模式中一种主要依赖于是否窗口的内容有任何布局视图能够滚动他们的内容。如果有这样的一个视图,这个窗口将调整大小,这样的假设可以使滚动窗口的内容在一个较小的区域中可见的。这个是主窗口默认的行为设置。

"adjustResize"

/ M" R: m- W( Z. Q6 d*A
Activity主窗口总是被调整屏幕的大小以便留出软键盘的空间

"adjustPan"


Activity主窗口并不调整屏幕的大小以便留出软键盘的空间。相反,当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分。这个通常是不期望比调整大小,因为用户可能关闭软键盘以便获得与被覆盖内容的交互操作。


20131218读后感

        这个问题困扰我比较长时间,今天看到上面这篇文章把它解决了。感谢博主分享。

20131218结束

### Android软键盘弹出布局底部控件被顶上去解决方案 在Android开发中,当软键盘弹出布局中的底部控件可能会被顶起。这种情况通常是由`windowSoftInputMode`属性设置不当引起的。以下是一些可能的解决方案[^3]: 1. **调整`windowSoftInputMode`属性** 在`AndroidManifest.xml`文件中,可以通过为Activity设置`android:windowSoftInputMode`属性来控制软键盘的行为。例如,使用`adjustPan`可以避免底部控件被顶起,而是将整个布局向上平移以确保输入框可见: ```xml <activity android:name=".YourActivity" android:windowSoftInputMode="adjustPan" /> ``` 这种方法适用于需要保持布局固定而不改变其结构的场景。 2. **使用`adjustResize`配合根布局调整** 如果希望软键盘弹出重新调整布局大小,可以使用`adjustResize`。但需要注意的是,这种方式要求根布局的高度能够动态变化,通常推荐使用`ConstraintLayout`或`LinearLayout`作为根布局: ```xml <activity android:name=".YourActivity" android:windowSoftInputMode="adjustResize" /> ``` 3. **自定义行为:通过代码监听软键盘状态** 如果上述两种方式无法满足需求,可以通过代码监听软键盘的显示和隐藏,并手动调整布局。例如,使用`ViewTreeObserver.OnGlobalLayoutListener`监听布局变化: ```java public void setupKeyboardListener(View rootView, final View bottomView) { final Rect r = new Rect(); rootView.getWindowVisibleDisplayFrame(r); int screenHeight = rootView.getRootView().getHeight(); rootView.getViewTreeObserver().addOnGlobalLayoutListener(() -> { int currentHeight = screenHeight - r.bottom; if (currentHeight > screenHeight * 0.25) { // 软键盘弹出 bottomView.setVisibility(View.GONE); // 隐藏底部控件 } else { // 软键盘关闭 bottomView.setVisibility(View.VISIBLE); // 显示底部控件 } }); } ``` 4. **使用第三方库** 如果项目较为复杂,也可以考虑使用第三方库如`KeyboardVisibilityEvent`来简化软键盘的监听逻辑[^4]。 以上方法可以根据具体需求选择合适的方案进行实现。 ### 注意事项 - 如果使用`adjustPan`,确保输入框不会被软键盘遮挡。 - 使用`adjustResize`,需注意布局的嵌套层级,避免因嵌套过深导致性能问题。 - 自定义监听逻辑,记得在适当候移除`OnGlobalLayoutListener`以防止内存泄漏。 ```java rootView.getViewTreeObserver().removeOnGlobalLayoutListener(this); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值