当视图聚焦于android时,如何显示软键盘?

时间:2012-09-04 18:35:16

标签: android

当我的活动开始时,我的edittext会自动获得焦点,但软键盘不会出现。此外,当我以编程方式在视图上调用.requestFocus()时,它会获得焦点,但软键盘也不会出现。视图的示例如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:padding="10dp">

 <EditText
    android:id="@+id/editTextTransactionName"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="@string/edittext_description"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:imeOptions="actionNext"
    android:inputType="text"/> 
</LinearLayout>

如果点击,似乎只显示软键盘。这是默认行为的原因吗?当打开用作表单的活动时,我会直观地期望键盘出现,以便您可以立即输入数据。

1 个答案:

答案 0 :(得分:2)

考虑阅读: Android Actionbar Tabs and Keyboard Focus

requestFocus非常不可靠。

显然这不是默认行为。 如果您真的希望自动显示键盘,请在EditText内模拟“点按”,这里对我有用(这比调用showSoftInput更安全,因为requestFocus的行为不可靠,加上你不需要对键盘进行微观管理):

EditText tv = (EditText)findViewById(R.id.editText);
tv.post(new Runnable() {

            @Override
            public void run() {
                Log.d("RUN", "requesting focus in runnable");
                tv.requestFocusFromTouch();
                tv.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , tv.getWidth(), tv.getHeight(), 0));
                tv.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , tv.getWidth(), tv.getHeight(), 0));
            }
        });

我认为键盘无法打开的原因是用户必须有机会在决定首先开始编辑之前看到整个窗口。