活动开始时为什么显示软键盘?

时间:2013-09-10 14:28:16

标签: android user-interface android-edittext scrollview android-softkeyboard

在比较开发人员之间的设计时,我们发现了一种奇怪的行为。经过一番分析后,我们进行了观察。

当活动开始时,在某些情况下会出现键盘但有时不会出现。

事实上,如果没有ScrollView,则EditText默认情况下不会显示软键盘。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".TestActivity" >

    <EditText
        android:id="@+id/editText1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:ems="10"
        android:inputType="text" >
        <requestFocus />
    </EditText>
</LinearLayout>

但是当我们添加ScrollView时,默认情况下会显示软键盘。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".TestActivity" >

    <ScrollView
        android:id="@+id/scrollView1"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" >
        <EditText
            android:id="@+id/editText1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:inputType="text" >
            <requestFocus />
        </EditText>
    </ScrollView>
</LinearLayout>

它仅取决于ScrollView的存在。我们可以使用AndroidManifest中的特定声明来解决这个问题,但这是默认行为。

我和我的同事们想知道为什么会这样?

3 个答案:

答案 0 :(得分:3)

在挖掘Android代码并使用EditText构建一些测试布局后,我就会对此问题有所了解。

由于ScrollView定义为

 public class More ...ScrollView extends FrameLayout { ... }

我尝试使用FrameLayout作为EditText项的容器。因此,不会触发软件键盘。

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <EditText
        android:id="@+id/editText1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:inputType="text" >
        <requestFocus />
    </EditText>
</FrameLayout>

但正如问题中所写,使用ScrollView触发软件键盘(我简化了xml源代码)。

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <EditText
        android:id="@+id/editText1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:inputType="text" >
        <requestFocus />
    </EditText>
</ScrollView>

因此,允许触发软件键盘的元素位于ScrollView源文件中。

编辑:在创建了我自己的类MyFrameLayout扩展FrameLayout并使用代码后,我发现它是默认的scrollview样式(R.attr.scrollViewStyle),它负责显示键盘或不......

Edit2:最后,属性android:scrollbars允许键盘在启动时自动触发...

答案 1 :(得分:0)

在我的情况下android:scrollbars修复此问题,直到我不得不添加:

android:windowSoftInputMode="adjustResize"> 

键盘显示时可以滚动。

为了能够使用我必须添加的两个属性:

android:focusableInTouchMode="true"

在Scrollview的孩子中

我在这里找到了focusableInTouchMode的答案: Stop EditText from gaining focus at Activity startup

答案 2 :(得分:-1)

这是因为当启动和app时,android专注于第一个可用的视图。在第一种情况下,它是EditText,这就是键盘弹出的原因。在第二种情况下,第一个视图是ScrollView是第一个视图,它不需要键盘,所以它没有显示。 此外,在第一种情况下,您可以删除<requestFocus />,并且在某些设备上,键盘不会弹出。希望这会有所帮助。