文档章节

Android软键盘遮挡的四种解决方案

少年追梦
 少年追梦
发布于 2015/07/14 09:56
字数 1330
阅读 1297
收藏 0

一问题: 在编辑框输入内容时会弹出软键盘,而手机屏幕区域有限往往会遮住输入界面

二解决方案:

方法一:

在你的activity中的oncreate中setContentView之前写上这个代码

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

方法二:

在 项目的AndroidManifest.xml文件中界面对应的<activity>里加入

这样会让屏幕整体上移。如果加上的 是 android:windowSoftInputMode="adjustPan"这样键盘就会覆盖屏幕。

关于android:windowSoftInputMode

activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性。

这个属性能影响两件事情:

【一】当有焦点产生时,软键盘是隐藏还是显示

【二】是否减少活动主窗口大小以便腾出空间放软键盘

它的设置必须是下面列表中的一个值,或一个”state…”值加一个”adjust…”值的组合。在任一组设置多个值——多个”state…”values,例如&mdash有未定义的结果。各个值之间用|分开。

<activity android:windowSoftInputMode="stateVisible|adjustResize". . . >

在这设置的值(除"stateUnspecified"和"adjustUnspecified"以外)将覆盖在主题中设置的值

各值的含义:

  【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置

  【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示

  【C】stateHidden:用户选择activity时,软键盘总是被隐藏

  【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的

  【E】stateVisible:软键盘通常是可见的

  【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态

  【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示

  【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间

  【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分



方法三:

把顶级的layout替换成ScrollView,或者说在顶级的Layout上面再加一层ScrollView。这样就会把软键盘和输入框一起滚动了,软键盘会一直处于底部。

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"  
 android:layout_width="fill_parent" android:layout_height="fill_parent">  
<LinearLayout android:layout_width="fill_parent"  
android:layout_height="fill_parent" android:orientation="vertical">  
  
</LinearLayout>  
</ScrollView>



三:    代码可控性方法

1:主界面布局文件:

<com.jereh.overidelinearlayout.LinearLayoutView xmlns:android="http://schemas.android.com/apk/res/android"   android:layout_width="match_parent"  
  
    android:id="@+id/login_root_layout"  
    android:layout_height="match_parent"  
android:orientation="vertical">  
<!—这里模仿一个登录界面-->  
    <LinearLayout  
        android:id="@+id/login_layout_logo"  
        android:layout_width="match_parent"  
        android:layout_height="0dp"  
        android:layout_weight="10"  
        android:background="#ff0000"  
        android:orientation="vertical" >  
        <ImageView  
            android:id="@+id/textView1"  
            android:layout_width="fill_parent"  
            android:layout_height="fill_parent"  
            android:src="@drawable/login_logo"  
            android:scaleType="fitXY"/>  
    </LinearLayout>  
    <!—输入框和密码框-->  
    <LinearLayout  
        android:layout_width="match_parent"  
        android:layout_height="0dp"  
        android:layout_marginTop="20dp"  
        android:layout_weight="3"  
        android:orientation="vertical" >  
    <EditText  
        android:id="@+id/editText1"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:layout_alignLeft="@+id/textView1"  
        android:layout_alignParentBottom="true"  
        android:layout_gravity="center_vertical"  
        android:hint="用户名"  
        android:ems="10" >  
        <requestFocus />  
    </EditText>  
      
    <EditText  
        android:id="@+id/editText1"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:layout_alignLeft="@+id/textView1"  
        android:layout_alignParentBottom="true"  
        android:layout_gravity="center_vertical"  
        android:hint="密码"  
        android:ems="10" >  
        <requestFocus />  
    </EditText>  
    </LinearLayout>  
</com.jereh.overidelinearlayout.LinearLayoutView>

可以看出关键地方在于LinearLayoutView这个自定义组件

2:自定义自定义LinearLayoutView

该组件可实现根据软键盘的弹出/关闭而隐藏和显示某些区域,这是问题解决最关键部分,主要有两点:

  ① 重写onSizeChanged方法

  该方法是View生命周期的方法,当View尺寸发生变化时调用,如竖屏横屏切换、软键盘弹出。这里当软键盘弹出造成View尺寸改变,就会调用onSizeChanged方法,在该方法实现代码的核心思想是根据尺寸变化,当变大(软键盘弹出),将某些区域隐藏以给编辑界面预留出足够显示空间;当恢复(软键盘关闭),再将隐藏的区域显示出来

protected void onSizeChanged(int w,final int h, int oldw,final int oldh) {  
  
            super.onSizeChanged(w, h, oldw, oldh);  
            uiHandler.post(new Runnable() {  
            public void run() {  
                if (oldh - h > SOFTKEYPAD_MIN_HEIGHT){    //    软键盘关闭  
                keyBordStateListener.stateChange(KEYBORAD_SHOW);//回调方法显示部分区域  
                }else {    //    软键盘弹出                  
                if(keyBordStateListener != null){  
                keyBordStateListener.stateChange(KEYBORAD_HIDE);// 回调方法隐藏部分区域  
}  
                }  
            }  
            });  
        }

 ②提供KeyBordStateListener  接口采用回调机制调用接口的实现方法。

public interface KeyBordStateListener{        public void stateChange(int state);}//定义接口  
  
  
private KeyBordStateListener  keyBordStateListener;  
    public void  setKeyBordStateListener(KeyBordStateListener keyBordStateListener) {  
        this.keyBordStateListener = keyBordStateListener;  
    }  
LinearLayoutView组件的完整代码:  
public class LinearLayoutView extends LinearLayout{  
    public static final int KEYBORAD_HIDE = 0;  
    public static final int KEYBORAD_SHOW = 1;  
    private static final int SOFTKEYPAD_MIN_HEIGHT = 50;  
    private Handler uiHandler = new Handler();  
    public LinearLayoutView(Context context) {  
        super(context);  
    }  
    public LinearLayoutView(Context context, AttributeSet attrs) {  
        super(context, attrs);  
    }  
    @Override  
    protected void onSizeChanged(int w,final int h, int oldw,final int oldh) {  
        // TODO Auto-generated method stub  
        super.onSizeChanged(w, h, oldw, oldh);  
        uiHandler.post(new Runnable() {  
            @Override  
            public void run() {  
                if (oldh - h > SOFTKEYPAD_MIN_HEIGHT){          
                    keyBordStateListener.stateChange(KEYBORAD_SHOW);  
                }else {                      
                    if(keyBordStateListener != null){  
                        keyBordStateListener.stateChange(KEYBORAD_HIDE);}  
                }  
            }  
        });  
    }  
    private KeyBordStateListener  keyBordStateListener;  
    public void 、setKeyBordStateListener(KeyBordStateListener keyBordStateListener) {  
        this.keyBordStateListener = keyBordStateListener;  
    }  
    public interface KeyBordStateListener{          
        public void stateChange(int state);  
    }

3.主界面MainActivity

public class MainActivity extends Activity implements KeyBordStateListener {  
  
private LinearLayoutView resizeLayout;  
      
private LinearLayout logoLayout;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        //获得可根据软键盘的弹出/关闭而隐藏和显示某些区域的LinearLayoutView组件      
        resizeLayout = (LinearLayoutView) findViewById(R.id.login_root_layout);  
        //获得要控制隐藏和显示的区域  
        logoLayout = (LinearLayout) findViewById(R.id.login_layout_logo);  
        resizeLayout.setKeyBordStateListener(this);//设置回调方法  
    }  
    //实现接口中的方法,该方法在resizeLayout的onSizeChanged方法中调用  
    @Override  
    public void stateChange(int state) {  
        // TODO Auto-generated method stub  
        switch (state) {  
        case LinearLayoutView.KEYBORAD_HIDE:  
            logoLayout.setVisibility(View.VISIBLE);  
            break;  
        case LinearLayoutView.KEYBORAD_SHOW:  
            logoLayout.setVisibility(View.GONE);  
            break;  
        }  
    }



本文转载自:http://www.jerehedu.com/fenxiang/159505_for_detail.htm

少年追梦
粉丝 2
博文 51
码字总数 6940
作品 0
海淀
程序员
私信 提问
Android 输入法键盘和activity页面遮挡问题解决

相信大家在开发时会遇到弹出软键盘后,输入框上移就看不到输入框了,其实只要将Webview放到了ScrollView中,将ScrollView改为LinearLayout问题解决了,不会在弹出软键盘后大幅滚动。不过下面...

红豆与绿豆
2015/10/29
206
0
adjustResize模式下ExpandaleListView中输入框焦点错乱及布局底部的导航栏被顶在键盘上方的处理

  为了更好的用户体验,煎熬了许久,得到这么个解决方案。在此记录下来,以供后来者参考。   第一部分     清单文件中组件activity的属性值的含义:      【A】stateUnspecifie...

Prime_T
2018/11/29
0
0
input 输入框被软键盘遮挡问题

1.安卓手机 在软键盘被弹起来的时候输入框不被遮挡,支持性良好 2.ios手机 在软键盘被弹起来的时候输入框被遮挡,体验很不好 在经过多次实验发现,ios手机输入框被弹起的瞬间是不被遮挡的,过...

爱喝水的小熊
2018/06/06
2.2K
0
AndroidManifest.xml文件详解(activity)(五)

android:taskAffinity 这个属性用于跟Activity有亲缘关系的任务。带有相同亲缘关系的Activity,在概念上是属于相同任务的(从用户的角度看,它们是属于同一应用程序的)。任务的亲缘关系是通...

长平狐
2012/10/16
322
0
android 记一次解决键盘遮挡问题

文章链接:https://mp.weixin.qq.com/s/1gkMtLu0BTXOUOj6isDjUw 日常android开发过程中,会遇到编辑框输入内容弹出软键盘,往往会出现键盘遮挡内容,或者出现页面整体上移的,或多或少在体验...

程序猿tx
2018/12/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SQL性能优化

SQL性能优化 一、SQL的执行顺序 顺序:FROM——ON——JOIN——WHERE——GROUP BY——SUM、COUNT——HAVING——SELECT——DISTINCT——ORDER BY——LIMIT 与写SQL的顺序不同,SQL的执行顺序并...

一字见心
2分钟前
2
0
x001-版本介绍

python版本介绍 目前有2 和 3 有很多企业用的代码是2版本,随着技术的发展,以后用3的会成为大趋势 python3的安装 yum -y install wget gcc zlib-devel bzip2-devel openssl-devel ncurses-d...

侠客行之石头
4分钟前
2
0
聊聊rocketmq的TransientStorePool

序 本文主要研究一下rocketmq的TransientStorePool TransientStorePool rocketmq-all-4.6.0-source-release/store/src/main/java/org/apache/rocketmq/store/TransientStorePool.java publi......

go4it
昨天
5
0
笔记

场外借贷, 质押 ,托管, 永续合约. 场外借贷,n签合同. 新功能 证券交易组负责中信证券机构及个人投资交易相关系统,服务机构及个人投资客户, 涉及到两融、期权、 期货、做市等境内境外创新业...

MtrS
昨天
5
0
Pycharm最新激活码2019----亲测可用

今天来讲解下pycharm的激活码使用 其实非常简单 把激活码填入下面的地方即可。如果不知道在哪里,那么就选菜单栏里的help再选Register就会弹出下面的界面 激活码网址里面有 lookdiv.com 里面...

chenhongjiang
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部