安卓软键盘的处理

        安卓软键盘的处理是相对来说比较复杂的,首先说说我的需求是软键盘弹起的时候我需要显示布局1,收起的时候我显示布局2,再者我需要保持软键盘的状态,无论是按home键还是锁屏键,走的时候是什么状态回来的时候就是什么状态,就这个两个需求,先说第一个吧,监听软键盘的弹出和隐藏;

        这个网上一搜一大堆,我推荐个链接http://www.jb51.net/article/111647.htm;监听软键盘的状态一定要设置android:windowSoftInputMode="adjustResize"

public class MainActivity extends AppCompatActivity implements View.OnLayoutChangeListener {

    private View rootView;
    //软件盘弹起后所占高度阀值
    private int keyHeight = 0;
    private View layout1;
    private View layout2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        keyHeight =getScreenHeight(this) / 3;
        rootView = findViewById(R.id.rootView);
        rootView.addOnLayoutChangeListener(this);
        layout1 = findViewById(R.id.layout1);
        layout2 = findViewById(R.id.layout2);
    }

    @Override
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
        //弹出
        if ( oldBottom != 0 && bottom != 0 && (oldBottom - bottom > keyHeight)) {
            Log.e("flag--","MainActivity--onLayoutChange--29"+"                    "+"弹出");
            layout2.setVisibility(View.VISIBLE);
            layout1.setVisibility(View.GONE);
        } else if ( oldBottom != 0 && bottom != 0 && (bottom - oldBottom > keyHeight)) {//收起
            Log.e("flag--","MainActivity--onLayoutChange--33"+"                        "+"收起");
            layout2.setVisibility(View.GONE);
            layout1.setVisibility(View.VISIBLE);
        }
    }
    /**
     * 获得屏幕高度,考虑到了虚拟按键
     *
     * @param aContext 上下文
     * @return 屏幕宽度
     */
    public static int getScreenHeight(Context aContext) {
        WindowManager manager = (WindowManager) aContext.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics out = new DisplayMetrics();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            manager.getDefaultDisplay().getRealMetrics(out);
        } else {
            manager.getDefaultDisplay().getMetrics(out);
        }
        return out.heightPixels;
    }
}

在项目中我是用的第一种,这样就可以轻松实现第一个需求了。

现在说说第二个需求,你会发现,你按home键的时候  键盘是正常的不用处理,你按锁屏键的时候,键盘会自动收起,看到这个现象不知道你有没有监听按锁屏键呢?我觉得这个很麻烦,我们可以在可以用一个Boolean值记录这个软键盘的状态,在onresume的时候根据这个状态进行恢复就可以了,按照这个思路你会发现,你在按锁屏键的时候,软键盘自动收起了这个记录的就不准了,怎么办呢?我的思路是在在息屏的时候ostop的时候onLayoutchange()这个方法不回调,即:

@Override
protected void onStop() {
    super.onStop();
    isStop=true;
}
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
    //弹出
    if (isStop){
        return;
    }
    if (!isShown && oldBottom != 0 && bottom != 0 && (oldBottom - bottom > keyHeight)) {
        isShown = true;
        mSearchRecommendLayout.setVisibility(View.VISIBLE);
        mResultLayout.setVisibility(View.GONE);
    } else if (isShown && oldBottom != 0 && bottom != 0 && (bottom - oldBottom > keyHeight)) {//收起
        isShown = false;
        if (isFinsh){
            finish();
        }
    }
}
现在是解决了锁屏不改变的问题了,也带来了一个更大的问题了,只要走了onstop这个方法,onLayoutChange这个方法就不走了,这个怎么办呢,我是这么做的,就是在onresume的时候用handler延时个300毫秒把isStop这个值改为false就可以了。

两个需求现在已经完成了,在补充两点:

1:软键盘手动弹出隐藏的时候的flags的值代表什么意思,推荐一个比较好的博文

http://blog.csdn.net/ccpat/article/details/46717573

2:还有就是当你把

android:imeOptions="actionSearch"
的时候,你监听点击搜索的时候,

editText.setOnKeyListener(new OnKeyListener() {
    @Override

    public boolean onKey(View v, int keyCode, KeyEvent event) {

        if (keyCode == KeyEvent.KEYCODE_ENTER) {
         
        }
        return false;
    }
});

这样写,你会发现这个判断会进来两次,如果你再里面进行的是网络请求,你会发现会请求翻倍,是因为在按下和抬起的时候都会回调,所以你可以再加一个判断条件,event.getAction()看你是要down还是up事件,就可以了。

就这么多了,折磨人的软键盘,如果有问题,欢迎评论交流


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值