键盘那些事儿

首先界面如下所示

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="com.example.guoyan1.keyboarddemo.MainActivity">
    <EditText
        android:id="@+id/top_edit"
        android:text="点击展示键盘"
        android:layout_width="match_parent"
        android:layout_height="100dp"/>
    <EditText
        android:layout_alignParentBottom="true"
        android:id="@+id/keyboard_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
</RelativeLayout>复制代码

第一种情况:

清单文件如下所示

<activity
    android:name=".MainActivity"
    >
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>

        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>复制代码


当我们点击顶部的输入框的时候键盘弹出情况如下:


这个时候界面没有被顶上去,只是键盘盖在了界面上,接着我们继续点击底部的输入框界面显示如下:


整个界面被顶上去了,而且底部的输入框紧贴着键盘显示。

解决办法:

如果我们取消第二个输入框的焦点呢,手动去调用该view的点击事件,在点击的时候添加如下事件

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mTopEdit = (EditText) findViewById(R.id.top_edit);
    mKeyboard = (EditText) findViewById(R.id.keyboard_tv);
    mKeyboard.clearFocus();
    mKeyboard.setFocusable(false);
    mKeyboard.setFocusableInTouchMode(false);
    mKeyboard.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    if (v.hasFocus()){
        Toast.makeText(getApplicationContext(),"hasFocus",0).show();
    }
    show(v);
}

public static void show(View view) {
    if (null != view) {
        InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(InputMethodManager.RESULT_UNCHANGED_SHOWN, InputMethodManager.RESULT_UNCHANGED_HIDDEN);
    }
}复制代码

此时我们发现点击顶部的输入框和底部的输入框点击之后的界面的显示效果是一致的都如下图所示:键盘盖在了界面上


也就是说如果在界面的底部有输入框并且该输入框的的view有焦点的话,当点击该view键盘弹出的时候,输入框会随着键盘的弹出被顶起来进而整个界面上移,所以不让其顶起的办法就是底部的输入框去除焦点手动添加点击事件,但是去除某一个view的焦点又有一个坑,那就是

mKeyboard.clearFocus();复制代码

这句代码并没有起作用,要想真正的去除某一个view的焦点需要添加如下代码:

mKeyboard.clearFocus();
mKeyboard.setFocusable(false);
mKeyboard.setFocusableInTouchMode(false);复制代码

第二种情况:

但是如你的清单文件如下所示:

<activity
    android:name=".MainActivity"
    android:configChanges="orientation|screenSize|keyboardHidden"
    android:windowSoftInputMode="stateAlwaysHidden|adjustResize"
    >
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>

        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>复制代码

adjustResize意思是当键盘弹出的时候整个界面会被重新绘制(拙见),一般情况下无论是点击底部的Editext还是点击顶部的EditText的时候界面都不会被顶上去,但是底部的EditText会随着会随着键盘的出现而上移,如下图所示:


但是如果你设置了全屏模式

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_FULLSCREEN);复制代码

以上代码又把结果拉回了第一种情况点击顶部的EditText的时候键盘弹起盖在整个页面上,点击底部的EditText的时候整个页面被弹起了(还是焦点的问题)如果去底部EditText的焦点并手动添加点击事件呼起键盘的时候结果又同第一中情况的解决办法,键盘改在了界面上底部的EditText被盖住了,但是产品的需求是底部的输入框要紧贴着键盘被顶起来但是整个见面不能动。(未完待续)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值