记录一下刚刚解决的问题,DialogFragment中的EditText获得焦点后自动弹出输入法的办法。
网上找到好多资料,但是很多已经过时或者不是针对dialog的设置。
现在将我测试成功的方法记录如下,供大家参考。
现在比较喜欢继承DialogFragment来实现dialog,这样dialog相关的代码可以分离出去,而且dialog的生命周期可以和Fragment一样管理。而我们现在讨论的弹出输入法也和生命周期回调方法有关。
继承DialogFragment实现dialog,实现onCreateDialog()方法,在这个方法中创建dialog并返回,这和以前创建diglog是一样的。
@Override public Dialog onCreateDialog(Bundle savedInstanceState) { log.info("onCreateDialog"); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle("密码输入框"); builder.setMessage("输入密码:"); editTextPassword = new EditText(getActivity()); editTextPassword.setFocusable(true); editTextPassword.setFocusableInTouchMode(true); editTextPassword.requestFocus(); builder.setView(editTextPassword); builder.setPositiveButton(android.R.string.ok, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.setNegativeButton(android.R.string.cancel, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); return builder.create(); }
上面的代码创建了一个Alert类型的Dialog,并且包含一个可以输入的EditText。
好多人都说,EditText获得焦点后,就会弹出输入法,其实不然。具体原因我也不是很清楚,在这里我们还需要手动让输入法出现。
实现DialogFragment的生命周期方法onResume(),这个方法会在dialog显示的时候被回调,然后在里面发送一个延时消息,调出输入法。
@Override public void onResume() { super.onResume(); log.info("onResume"); (new Handler()).postDelayed(new Runnable() { public void run() { log.info("postDelayed"); InputMethodManager inManager = (InputMethodManager)editTextPassword.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); inManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); } },500); }
这样,我们在使用这个dialog的时候,就会自动弹出输入法了。