谢谢你,安德鲁。只是我想扩展文章,你参考一下。
你可能注意到了,这篇文章(和上面的代码)使用了 EditText,这不是我想要的。幸运的是,正如我所发现的,这适用于任何 TextView,只要它是focused。
如何在没有硬键盘的情况下使视图聚焦?使其成为 focusableInTouchMode 和 requestFocus。
这是我的布局:
<?xml version="1.0" encoding="us-ascii"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:imeOptions="actionGo"
android:inputType="numberDecimal"
android:text="==== Just to make it visible ======"
android:focusableInTouchMode="true">
<requestFocus/>
</TextView>
</FrameLayout>
注意,您可以使用 android:imeOptions 和 android:inputType 来设置软键盘的类型和外观。
而且代码看起来很简单。您在单击时调出键盘并在按下操作键(代码 KeyEvent.KEYCODE_ENTER)时将其关闭。 BACK按钮也必须由系统处理,否则
我们将永远陷入困境:)
以下代码假定 API 3+。
@TargetApi(Build.VERSION_CODES.CUPCAKE)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.startup);
TextView tv = (TextView)findViewById(R.id.text);
final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);
`}
});
tv.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
int action = event.getAction();
switch (action) {
case KeyEvent.ACTION_DOWN:
Log.d("KbdTest", "Action Down. Key Code: " + keyCode);
if (keyCode == KeyEvent.KEYCODE_ENTER)
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
return (keyCode != KeyEvent.KEYCODE_BACK);
case KeyEvent.ACTION_UP:
Log.d("KbdTest", "Action Up. Key Code: " + keyCode);
return (keyCode != KeyEvent.KEYCODE_BACK);
default:
Log.d("KbdTest", "Unknown action (" + action + "). Key Code: " + keyCode);
return false;
}
}
});
}
老实说,我并没有印象深刻。首先它显示光标,而我不想看到它。其次,它有时会设法编辑文本 (!),即使 onKey 中的 return true 预计会抑制任何干扰。
无论如何,这是一个很好的起点! :)