Android - 打开软键盘并在没有对话框或布局或编辑文本的情况下获取值
Android - open soft keyboard and get value without dialog or layout or edittext
有没有办法只打开软键盘,而无需实际对话框或输入字段,并以字符串形式获取输入值?
键盘本身已经有一个“完成”按钮;我可以只:按下一个按钮,键盘打开它自己的内置输入框,输入值,按“完成”,在一个变量中得到结果。
我会添加一个 editText 使其不可见并将焦点放在它上面。要明确显示它:
editText = (EditText)findViewById(R.id.myTextViewId);
editText.requestFocus();
InputMethodManager imm = (InputMethodManager)getSystemService(this.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY);
再隐藏起来
InputMethodManager imm = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
我设计了一个不同的解决方案,灵感来自 Tobias 的建议加上 this answer。
我创建了一个带有 EditText 的 AlertDialog 弹出窗口。然后我在编辑文本中添加了一个延迟的“触摸”以打开软键盘,然后处理“完成”事件以获取输入值并关闭底层弹出窗口。这是一些示例代码:
//Open an AlertDialog popup
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
//create a simple EditText
final EditText input = new EditText(activity);
input.setInputType(InputType.TYPE_CLASS_NUMBER);
input.setImeOptions(EditorInfo.IME_ACTION_DONE);
builder.setView(input);
//touch into the EditText to open the softkeyboard (600ms delay)
new Handler().postDelayed(new Runnable() {
public void run() {
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));
}
}, 600);
alertDialog = builder.show();
AlertDialog finalAlertDialog = alertDialog;
//Handle Keyboard event to get value and close the popup
input.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId <= EditorInfo.IME_ACTION_PREVIOUS)) {
doOperation();
finalAlertDialog.cancel();
}
return false;
}
});
有没有办法只打开软键盘,而无需实际对话框或输入字段,并以字符串形式获取输入值? 键盘本身已经有一个“完成”按钮;我可以只:按下一个按钮,键盘打开它自己的内置输入框,输入值,按“完成”,在一个变量中得到结果。
我会添加一个 editText 使其不可见并将焦点放在它上面。要明确显示它:
editText = (EditText)findViewById(R.id.myTextViewId);
editText.requestFocus();
InputMethodManager imm = (InputMethodManager)getSystemService(this.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY);
再隐藏起来
InputMethodManager imm = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
我设计了一个不同的解决方案,灵感来自 Tobias 的建议加上 this answer。 我创建了一个带有 EditText 的 AlertDialog 弹出窗口。然后我在编辑文本中添加了一个延迟的“触摸”以打开软键盘,然后处理“完成”事件以获取输入值并关闭底层弹出窗口。这是一些示例代码:
//Open an AlertDialog popup
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
//create a simple EditText
final EditText input = new EditText(activity);
input.setInputType(InputType.TYPE_CLASS_NUMBER);
input.setImeOptions(EditorInfo.IME_ACTION_DONE);
builder.setView(input);
//touch into the EditText to open the softkeyboard (600ms delay)
new Handler().postDelayed(new Runnable() {
public void run() {
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));
}
}, 600);
alertDialog = builder.show();
AlertDialog finalAlertDialog = alertDialog;
//Handle Keyboard event to get value and close the popup
input.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId <= EditorInfo.IME_ACTION_PREVIOUS)) {
doOperation();
finalAlertDialog.cancel();
}
return false;
}
});