前言:

时间过得可真快,一不转眼马上冬天就要来了。今天将主要介绍Android软键盘的显示和隐藏,有关于软键盘的显示和隐藏,相信大家在开发当中可能遇见各种坑,大家可能会觉得明明是按照官网标准写法写的,后来一测试竟然发现各种问题不能弹出软键盘,为了解决这种问题,下面我将重点跟大家讲解一下各种注意事项,相信大家看完了,有所感悟,避免各种深坑。那么,我们首先还是先来一起学习Android软键盘的显示和隐藏。


InputMethodManager类

Andorid中有关软键盘的显示和隐藏主要是通过iputMethodManager类来完成的。既然我们想要用来这个类,首先我们必须获取对象,方法如下:


InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);

获取对象好了之后,我们就可以通过这个对象来进行软键盘的操作了,在操作之前,我们还有一件事情要做的就是对该对象进行判断,其实也没什么的,就是为了避免空指针异常,代码如下:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
   //显示或者隐藏
}

好了,现在我们就可以开始通过inputMethodManager对象来进行软键盘的显示和隐藏。


显示软键盘

Android中是通过inputMethodManager类中的showSoftInput方法来显示软键盘的。

showSoftInput方法源码如下:


public boolean showSoftInput(View view, int flags) {  
        return showSoftInput(view, flags, null);
}


在这里,它有两个参数,第一个参数是表示当前要接收软键盘输入的View,第二个参数是表示当前软键盘显示控制的标记参数。

那么在这里需要注意的是,为什么会有人明明是按照这样去写的,结果就是不弹出软键盘呢?其实,经过网上查找资料后,我得知很多需要注意事项,如果一旦忽略一个细微的注意事项,那么有可能软键盘未能显示,下面分别看看有哪些注意事项。

1、第一个参数中的View必须是EditText,或者是EditText其子类,如果是其他类型的View,如果传递的例如是button,TextView等等,则showSoftInput方法显示无效。所以在这里第一个参数一般传递的是EditText对象。

2、第一个参数中的view当前必须已经获取到焦点(即view.isFocused()返回true),如果当前焦点不在该view上,则showSoftInput()方法不起作用。虽然EditText默认是可获取焦点的,但由于一个布局中可能会有多个控件可以获取焦点,焦点位置不一定会恰好在EditText上,所以此条件不一定满足。为了让showSoftInput()可以起作用,必须在之前showSoftInput()前先通过view.requestFocus();获取焦点。然后再执行showSoftInput()。


隐藏软键盘

到了这里,大家可能会觉得显示键盘利用了showSoftInput方法,那么既然是隐藏软件,那不就是hideSoftInput,然而很遗憾告诉你,并不是的,因为谷歌没有提供这样的方法给予我们利用开发,那么有没有其他方法呢?其实是有的,那么就是通过inputMethodManager类中的hideSoftInputFromWindow方法来隐藏键盘的,hideSoftInputFromWindow方法源码如下:


public boolean hideSoftInputFromWindow(IBinder windowToken, int flags) {
        return hideSoftInputFromWindow(windowToken, flags, null);
}

在这里,它同样也有两个参数,第一个参数表示View的windowToken,第二个参数是表示当前软键盘隐藏控制的标记参数。同样的隐藏键盘也有需要注意事项,注意事项分别有以下几个:

1、第一个参数并不是指定一个View,而是一个View的windowToken。那么如何获取到其windowToken呢?我们可以通过getWindow().getDecorView().getWindowToken()来获取。

2、第二个参数软键盘隐藏时候控制的标记参数,为了能够正常隐藏,这里一般直接写入为0。


综合案例

讲了那么多,如果大家还是不能够理解没关系,那么下面一起来看一个案例,相信大家一看更能深刻明白了!

在这里,我在Activity中加入了两个按钮,一个是显示键盘,一个是隐藏键盘,具体代码如下:


public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private EditText editText;
    private Button show_bt;
    private Button hide_bt;
    private InputMethodManager imm;
    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取InputMethodManager输入法管理器对象
        imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        //查找控件并且设置按钮点击事件
        initView();
    }

    private void initView() {
        editText= (EditText) findViewById(R.id.editText);
        show_bt= (Button) findViewById(R.id.show_bt);
        hide_bt= (Button) findViewById(R.id.hide_bt);
        show_bt.setOnClickListener(this);
        hide_bt.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            //显示键盘
            case R.id.show_bt:
                if (imm != null) {
                    editText.requestFocus();
                    imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
                    display("显示键盘");
                }
                break;
            //隐藏键盘
            case R.id.hide_bt:
                if (imm != null) {
                    editText.requestFocus();
                    imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
                    display("隐藏键盘");
                }
                break;
        }
    }

    public void display(String text){
        Toast.makeText(MainActivity.this,text,Toast.LENGTH_LONG).show();
    }
}



效果图如下:

android 默认不弹出软键盘 安卓如何调出软键盘_ide


代码运行起来了,效果看似还可以,但是大家可能会说,为什么这样的代码会在有些手机中不能正常的显示键盘呢?其实这些问题在这里我也未能一一回答和解决。毕竟安卓手机那么多,手机厂商也那么多,甚至有些手机被厂商设置了关闭了软键盘,例如夜神模拟器,我发现需要用户去开启软键盘后才能正常显示的。好了,今天有关Android--软键盘的显示和隐藏讲解到这里,希望对大家在日常开发当中有所帮助!