前言:
时间过得可真快,一不转眼马上冬天就要来了。今天将主要介绍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--软键盘的显示和隐藏讲解到这里,希望对大家在日常开发当中有所帮助!