`
unicorn25
  • 浏览: 67205 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

如何解决软键盘弹出引起的各种不适

阅读更多

在做登录和注册页面的时候,经常会遇到诸如软键盘挡住输入框的情况,android为此提供了一系列的的配置参数供选择,你可以在androidmanufist.xml的对应Activity的windowSoftInputMode属性中选择如下4者之一进行配置(紫色字):

 

int SOFT_INPUT_ADJUST_NOTHING

Adjustment option for softInputMode:

set to have a window not adjust for a shown input method.

int SOFT_INPUT_ADJUST_PAN

Adjustment option for softInputMode:

set to have a window pan when an input method is shown, so it doesn't need to deal with resizing but just panned by

the framework to ensure the current input focus is visible.

int SOFT_INPUT_ADJUST_RESIZE

Adjustment option for softInputMode:

set to allow the window to be resized when an input method is shown, so that its contents are not covered by the input method.

int SOFT_INPUT_ADJUST_UNSPECIFIED

Adjustment option for softInputMode:

nothing specified.

 

       <activity android:name=".LoginAc"

 

                  android:label="@string/app_name"
                  android:windowSoftInputMode="stateHidden|adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

 

四个参数意思如下:

SOFT_INPUT_ADJUST_NOTHING:         不调整(输入法完全直接覆盖住,未开放此参数)

SOFT_INPUT_ADJUST_PAN:                 把整个Layout顶上去露出获得焦点的EditText,不压缩多余空间,见图1

SOFT_INPUT_ADJUST_RESIZE:            整个Layout重新编排,重新分配多余空间,见图2

SOFT_INPUT_ADJUST_UNSPECIFIED:  系统自己根据内容自行选择上两种方式的一种执行(默认配置)

 

这里的多余空间指的是控件们通过weight分配机制得到的额外空间。

 

图1

 

 

图2

 

 

图3

 

代码实现方式为:

 

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

 

但是,这样的配置方法一般都很难完全满足需要,有得应用会做得比较好,让顶上去的Layout能够通过scrollbar滚动。这种解决方法网上有各种介绍,本人也是第一时间从网上找解决方法参考,但最终发现都并未把原理说清,而且大多数有错误,或者有多余配置,于是,我从android系统中源码中找参考案例,在Email应用中,找到了我想要的。效果如图4,5。

 

 

图4

 

 

图5

 

 

其对应的Activity是AccountSetupBasics.java,对应的xml文件为account_setup_basics.xml。

来学习下它的xml写法:

 

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:fillViewport="true"
    android:scrollbarStyle="outsideInset" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:orientation="vertical" >
            <TextView
                android:id="@+id/instructions"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dip"
                android:textSize="20sp"
                android:text="@string/accounts_welcome"
                android:textColor="?android:attr/textColorPrimary" />
            <View
                android:layout_width="fill_parent"
                android:layout_height="0dip"
                android:layout_weight="1" />
            <EditText
                android:id="@+id/account_email"
                android:hint="@string/account_setup_basics_email_hint"
                android:inputType="textEmailAddress"
                android:imeOptions="actionNext"
                android:layout_height="wrap_content"
                android:layout_width="fill_parent" />
            <EditText
                android:id="@+id/account_password"
                android:hint="@string/account_setup_basics_password_hint"
                android:inputType="textPassword"
                android:imeOptions="actionDone"
                android:layout_height="wrap_content"
                android:layout_width="fill_parent"
                android:nextFocusDown="@+id/next" />
            <CheckBox
                android:id="@+id/account_default"
                android:layout_height="wrap_content"
                android:layout_width="fill_parent"
                android:text="@string/account_setup_basics_default_label"
                android:visibility="gone" />
            <View
                android:layout_width="fill_parent"
                android:layout_height="0dip"
                android:layout_weight="1" />
        </LinearLayout>

        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="54dip"
            android:background="@android:drawable/bottom_bar" >
            <Button
                android:id="@+id/manual_setup"
                android:text="@string/account_setup_basics_manual_setup_action"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
                android:minWidth="@dimen/button_minWidth"
                android:layout_alignParentLeft="true"
                android:layout_centerVertical="true" />
            <Button
                android:id="@+id/next"
                android:text="@string/next_action"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
                android:minWidth="@dimen/button_minWidth"
                android:drawableRight="@drawable/button_indicator_next"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true" />
        </RelativeLayout>
    </LinearLayout>
</ScrollView>

 

 

 

1  它完全把ScrollView作为了一个根Layout,而不是网上好多文章写的在一个Linearlayout里面嵌入一个ScrollView(貌似这种是行不通的)。

然后把我们原来的根Layout搬入ScrollView(ScrollView只能有一个子控件),我查了下androidmanifist.xml和代码,未做任何以上2种方法的配置。

2  它定义了2个0dip的View帮助分配空间(设置其weight吃掉剩余空间,保证输入框处于界面中心位置),可以猜测出这里系统调用的是SOFT_INPUT_ADJUST_RESIZE参数,当所有有实际内容的控件空间总和超出特定范围时,ScrollView开始发挥作用。

 

如此,完美的解决我们遇到的问题。

另外,网上有人说想用SOFT_INPUT_ADJUST_RESIZE ,但又不希望背景图片被压缩,只要按如上方法把Linearlayout的背景图片设置好即可。

分享到:
评论
2 楼 yun2223 2014-09-03  
还没试  不过应该可以用的吧, 楼主辛苦了
1 楼 huhu20081 2011-12-01  
如果里面是个listview 就不好用了

相关推荐

    监听软键盘的弹出与收起

    当软键盘弹出时,由于屏幕可用空间减少,根布局的高度会相应减小;而当软键盘收起时,根布局的高度则会恢复。可以通过重写onGlobalLayout()方法并使用ViewTreeObserver来监听布局的变化: ```java rootView....

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

    在默认情况下,Android布局是静态的,当软键盘弹出时,布局不会自动调整。要改变这一行为,我们通常会采用以下几种方法: 1. **调整Activity的WindowSoftInputMode**: 在AndroidManifest.xml中,找到对应的...

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

    综上所述,实现禁止软键盘弹出并使用自定义键盘的功能,涉及到了Android布局设计、事件监听、DialogFragment的使用以及输入管理等多个方面。通过合理的设计和编程,我们可以提供更符合应用场景的用户体验。在keydemo...

    Android判断软键盘是否弹出

    Android系统在软键盘弹出或隐藏时会触发Activity的布局过程,我们可以通过监听这个过程来判断软键盘的状态。描述中提到的方法是通过重写`onLayout`方法来实现这一功能。 `onLayout`方法是View类的一个回调方法,它...

    Qt交叉编译后调用软键盘,解决软键盘背景全黑的问题

    本文将详细讲解如何在Qt交叉编译后,针对aarch64-linux-gnu架构的Zynq板调用软键盘,并解决软键盘背景全黑的问题。 首先,我们需要理解Qt的交叉编译过程。交叉编译是将程序在一种平台上编译,然后在另一种不同的...

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

    本示例"软键盘弹出时动态改变UI布局学习Demo"着重讲解如何处理这一常见问题,以提供良好的用户体验。 首先,我们需要理解Android中的布局管理。在默认情况下,当软键盘弹出时,Android会调整Activity的布局以适应...

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

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

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

    if (heightDiff &gt; dpToPx(context, 200)) { // 如果高度差超过200dp,假设软键盘弹出 // 软键盘弹出的处理逻辑 } else { // 软键盘隐藏的处理逻辑 } } }); // dp转px的辅助方法 public static float dpToPx...

    监听软键盘弹出和隐藏

    当软键盘弹出时,屏幕的可使用高度会减少,因此可以通过比较不同时间点的布局高度来判断软键盘是否弹出。然而,这种方法的缺点是它可能导致界面压缩,而不是控件平移,这可能不符合某些开发者的设计需求。如果需要在...

    点击文本框弹出软键盘

    5. 文件名称列表:“点击文本框弹出软键盘”可能是项目的主要文件,这可能包含VB或C#代码文件、资源文件(如软键盘的图像或图标)、以及项目配置文件。这些文件共同构成了实现这个功能的完整工程。 总的来说,通过...

    无软键盘弹出EditText

    "无软键盘弹出的EditText"是一个常见需求,主要是为了优化用户体验或者满足特殊设计要求。本篇文章将详细探讨如何实现这一功能。 首先,我们需要了解EditText的基本特性。EditText是Android系统提供的一种文本输入...

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

    本文将详细介绍如何解决这一问题,实现软键盘弹出时页面整体上移,以及点击空白区域收起软键盘的效果,并且将11位手机号格式化为xxx xxxx xxxx的显示形式。 首先,要让页面整体上移,我们需要在`AndroidManifest....

    Android 解决软键盘遮挡登陆按钮

    然而,当软键盘弹出时,布局不会自动适应键盘的高度,因此可能导致下方元素被遮挡。 解决软键盘遮挡登录按钮的方法主要有以下几种: 1. 使用`android:windowSoftInputMode="adjustResize"`: 在AndroidManifest....

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

    还可以创建一个BroadcastReceiver来监听系统的输入设备状态变化,当键盘弹出或收起时,系统会发送相应的广播。不过,这种方法需要声明权限,并且在Android 8.0及以上版本可能会失效。 ```java public class ...

    QT数字软键盘,包括QLineEdit弹出

    在描述中提到的“QlineEdit弹出的部分”,指的是在用户点击QLineEdit时,弹出数字软键盘。这通常通过自定义事件处理或插件实现。开发者可以监听QLineEdit的焦点变化事件,当获得焦点时显示软键盘,失去焦点时隐藏。 ...

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

    在AndroidManifest.xml中,针对登录Activity的标签添加这一属性,可以让Activity在软键盘弹出时调整其大小,使得底部的按钮始终可见。但需要注意,这种模式可能导致输入框失去焦点,用户无法直接在键盘上输入,所以...

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

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

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

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

    android 软键盘把界面顶起

    Android 软键盘调整界面问题解决方案 Android 软键盘的问题是 Android 开发中常见的问题之一。...通过了解软键盘的状态和调整方法,可以更好地解决软键盘相关问题,提高 Android 应用程序的用户体验。

    Android高级应用源码-android解决软键盘遮挡输入框的示例代码.zip

    首先,我们需要理解Android布局在软键盘弹出时的行为。默认情况下,Android会将整个布局向上移动以适应软键盘的显示,但这可能导致输入框仍然被键盘遮挡。为了解决这个问题,我们可以使用以下几种方法: 1. **调整...

Global site tag (gtag.js) - Google Analytics