关于EditText和软键盘的一些设定

1.android:imeOptions属性

editText控件通过设置android:imeOptions来改变默认的“完成”文本。这里举几个常用的常量值:

        (1)actionUnspecified未指定,对应常量EditorInfo.IME_ACTION_UNSPECIFIED效果:

(2)actionNone 没有动作,对应常量EditorInfo.IME_ACTION_NONE效果:

(3)actionGo去往,对应常量EditorInfo.IME_ACTION_GO 效果:

(4)actionSearch 搜索,对应常量EditorInfo.IME_ACTION_SEARCH效果: 

(5)actionSend 发送,对应常量EditorInfo.IME_ACTION_SEND效果:

(6)actionNext 下一个,对应常量EditorInfo.IME_ACTION_NEXT效果:

(7)actionDone 完成,对应常量EditorInfo.IME_ACTION_DONE效果:


 android:imeOptions="flagNoExtractUi" //使软键盘不全屏显示,只占用一部分屏幕 同时,

这个属性还能控件软键盘右下角按键的显示内容,默认情况下为回车键

 android:imeOptions="actionNone" //输入框右侧不带任何提示 

android:imeOptions="actionGo"   //右下角按键内容为'开始' 

android:imeOptions="actionSearch" //右下角按键为放大镜图片,搜索

 android:imeOptions="actionSend"   //右下角按键内容为'发送' 

android:imeOptions="actionNext"  //右下角按键内容为'下一步' 或者下一项

 android:imeOptions="actionDone" //右下角按键内容为'完成'


注意:如果设置了 键盘没有变化  那么需要单独加一些其他的属性 配合使用

xml中 属性设置:

1 将singleLine设置为true

2 将inputType设置为text 

java代码设置

  1. editText.setInputType(EditorInfo.TYPE_CLASS_TEXT);  
  2. editText.setImeOptions(EditorInfo.IME_ACTION_SEARCH); 

默认情况下软键盘右下角的按钮为“下一个”,点击会到下一个输入框,保持软键盘



 

设置 android:imeOptions="actionDone" ,软键盘下方变成“完成”,点击后光标保持在原来的输入框上,并且软键盘关闭



 

 

 

android:imeOptions="actionSend" 软键盘下方变成“发送”,点击后光标移动下一个


 
在这里设置的imeOptions如何使用呢?如下面的代码,让EditText实现setOnEditorActionListener,在onEditAction方法中actionId就对应我们设置的imeOptions。系统默认的actionId有:EditorInfo.IME_NULL、EditorInfo.IME_ACTION_SEND、EditorInfo.IME_ACTION_DONE等。这样我们就可以根据不同的EditText来实现不同的软键盘右下角功能键。

2.软键盘的设置

提起输入法我就想到了Edittext,输入法可以自动根据inputType来改变键盘的布局,在支付钱包中还特别隐藏的系统自带的输入法,直接让用户用软件自己的输入法,提高了安全性。所以,我们应该对输入法这个东西有些了解,让输入法为自己所用。

一、获取输入管理对象

final InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

 

二、操作输入法

 

1. 强制显示输入法

通过测试,我发现强制显示输入法必须要用一个editText来做,其实也挺正常的,输入法本身就是给editText输入用的,所以自然要定义一个editText。

布局文件中我用了一个editText和两个button

Java代码中,我们要找到这个editText,然后进行如下操作:

inputMethodManager.showSoftInput(editText, InputMethodManager.SHOW_FORCED);

全部代码:

复制代码
        final EditText editText = (EditText)findViewById(R.id.editText);
        
        final InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        Button showBtn = (Button) findViewById(R.id.input_button);
        
        showBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                
                inputMethodManager.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
              
            }
        });
复制代码

 

2. 强制隐藏输入法

用的布局文件还是刚刚那个,隐藏输入法就不需要editText了。直接在button的点击事件中写下面的代码就行。

inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);

全部代码:

复制代码
Button hideBtn = (Button)findViewById(R.id.hide_button);
        hideBtn.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO 自动生成的方法存根
                inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
            }
        });
复制代码

 

3. 根据输入法状态来显示/隐藏输入法

有时候我们需要根据输入法的状态来做处理:如果输入法已经显示,那么就隐藏它;如果输入法现在没显示,那么就显示它。

inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);

全部代码:

复制代码
        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
            }
        });
复制代码

 

4. 不自动弹出键盘

带有EditText控件的在第一次显示的时候会自动获得focus,并弹出键盘,如果不想弹出输入法,可以在Activity的oncreat中写上这行代码

// 禁止自动弹出输入框
        this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

 

// this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
// 用这个可以防止自动弹出那个输入法的Fragment.

也可以在mainfest文件中把对应的activity设置

Android:windowSoftInputMode="stateHidden" 或者android:windowSoftInputMode="stateUnchanged"。

复制代码
     <activity Android:name=".Main"
                  Android:label="@string/app_name"
                  Android:windowSoftInputMode="adjustUnspecified|stateHidden"
                  Android:configChanges="orientation|keyboardHidden">
            <intent-filter>
                <action Android:name="android.intent.action.MAIN" />
                <category Android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
复制代码

 

三、输入法常量

public static final int HIDE_IMPLICIT_ONLY

    hideSoftInputFromWindow(IBinder, int)中的标志,表示如果用户未显式地显示软键盘窗口,则隐藏窗口。

 

public static final int HIDE_NOT_ALWAYS

    hideSoftInputFromWindow(IBinder, int)中的标志,表示软键盘窗口总是隐藏,除非开始时以SHOW_FORCED显示。

 

public static final int RESULT_HIDDEN

    showSoftInput(View, int, ResultReceiver)和hideSoftInputFromWindow(IBinder, int, ResultReceiver)中ResultReceiver结果代码标志:软键盘窗口从显示切换到隐藏时的状态。

 

public static final int RESULT_SHOWN

    showSoftInput(View, int, ResultReceiver)和hideSoftInputFromWindow(IBinder, int, ResultReceiver)中ResultReceiver结果代码标志:软键盘窗口从隐藏切换到显示时的状态。

 

public static final int RESULT_UNCHANGED_HIDDEN

    showSoftInput(View, int, ResultReceiver)和hideSoftInputFromWindow(IBinder, int, ResultReceiver)中ResultReceiver结果代码标志:软键盘窗口不变保持隐藏时的状态。

 

public static final int RESULT_UNCHANGED_SHOWN

    showSoftInput(View, int, ResultReceiver)和hideSoftInputFromWindow(IBinder, int, ResultReceiver)中ResultReceiver结果代码标志:软键盘窗口不变保持显示时的状态。

 

public static final int SHOW_FORCED

    showSoftInput(View, int)标志,表示用户强制打开输入法(如长按菜单键),一直保持打开直至只有显式关闭。

 

public static final int SHOW_IMPLICIT

      showSoftInput(View, int)标志,表示隐式显示输入窗口,非用户直接要求。窗口可能不显示。

 

四、动态改变输入法键盘布局

 

我们知道EditText可以设置输入的类型,这样就能直接控制输入法的键盘布局了。但如果我们想要在代码中动态改变输入的类型呢?

//设置用户名的输入框是可以输入数字和字母的
usernameEt.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL);

usernameEt是一个editText,通过代码设置输入类型的方法是setInputType,后面传入不同的常量就可以设置不同的输入类型了。这点是editText中的知识,反正和输入法有关,所以就顺便提一下。

 

五、输入法和Activity视图的关系

 

输入法再怎么特殊,它也就是一个在phoneWindow中绘制的view,你可以把它当作一个dialog,因此它自然有它自己的位置。而它的位置又是由activity指定的,下面来分析下它的布局。

 

1. Activity初始时的布局

我在activity的上下各放了一个textview来表示activityview的顶端和末端。运行出来的效果如下:

 

2.  android:windowSoftInputMode="stateUnspecified"

我们在activity定义时加上这句话就表明,输入法按照默认的模式显示,软键盘的状态(隐藏或可见)没有被指定。系统将选择一个合适的状态或依赖于主题的设置。

<activity
            android:name=".MainActivity"
            android:label="@string/app_name" 
             android:windowSoftInputMode="stateUnspecified">

当我们点击show input后,跳出输入法 

效果:

可以看到,输入法直接盖到了原来的activity上了,下面的bottom直接被盖住了。如果想要看到被盖住的文字,必须要给布局外层套一个scrollView才行。

 

3. android:windowSoftInputMode="stateVisible"

这个模式下,activity和输入法是同时出现的,也就是说activity启动后输入法也会启动,不用我们点击show input。效果和上面一样,输入法盖住了下面的文字。

 

4. android:windowSoftInputMode="stateAlwaysVisible"

和上面的一样,但解释是,用户选择这个activity时,键盘是可见的。我的理解是如果这个activity获取了焦点,那么键盘会自动出现。感觉和上面的没啥区别。

 

5. android:windowSoftInputMode="stateHidden"

在activity中有edittext时也不显示输入法,也就是说只有当你点击了editText后输入法才会出现。效果是盖住下面的bottom文字。

 

6. android:windowSoftInputMode="stateAlwaysHidden"

这个和上面的一样,也是不自动显示输入法。效果和也是盖住下面的文字。

 

7. android:windowSoftInputMode="adjustResize"

压缩模式。当输入法出现时,activity重新调整界面的布局,让原来的界面和输入法处于同一个平面中。效果如下,可以明显的看到bottom没有被压住。

 

8.android:windowSoftInputMode="adjustPan"

平移模式。当输入框不会被遮挡时,该模式没有对布局进行调整,然而当输入框将要被遮挡时, 窗口就会进行平移。也就是说,该模式始终是保持输入框为可见 

 

后来

经过测试发现,现在设置editText的requestFocuse没有用了,如果希望已进入界面就显示输入法,那么必须要在activity的配置文件中进行输入法的指定,比如像下面这样:

android:windowSoftInputMode="stateVisible|adjustPan"

如果在有输入法显示的界面中,你手动调用finish方法,你会发现输入法是不会消失的。所以如果遇到这样的界面,需要复写finish()然后强制关闭输入法。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值