【问题标题】:How to hide keyboard in a edittext + listview layout如何在edittext + listview布局中隐藏键盘
【发布时间】:2012-09-29 00:11:51
【问题描述】:

我有一个由 ListView(从 AsynTask 加载)和一个 EditText(所以我可以过滤该列表)组成的 LinearLayout。代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="Filtrar por nombre..." >

    </EditText>

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>
</LinearLayout>

问题是,当活动开始时,键盘会显示出来,我只想在单击 EditText 进行搜索时显示它。

我尝试了几种方法,例如在清单中编写以下内容

android:windowSoftInputMode="stateHidden"

并将其包含在类中

InputMethodManager iMM = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
iMM.hideSoftInputFromWindow(editText.getWindowToken(), 0);

我唯一做到的是不显示键盘,但不显示列表中加载的内容(只有 EditText 和屏幕的其余部分纯黑色),一旦我点击 EditText,它们就会同时出现键盘和 listView 的东西。

有什么可能的解决方案吗?

编辑:

我尝试了以下解决方案(感谢@Sush、@boztalay 和@Agata Sworowska),但没有一个成功。

-放置在我的布局中:

android:focusable="true"
android:focusableInTouchMode="true"

android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"

-并放在我的 onCreate() 方法中:

ListView listView = findViewById(R.id.list);
listView.setFocusableInTouchMode(true);
listView.requestFocus();

还有其他可能吗?

新编辑:

我注意到,当它不关注 EditText 时,listView 不会加载,直到我关注 EditText,就像它正在等待它一样。我尝试在加载 ListView 的代码之后设置 EditText,但问题仍然存在。

【问题讨论】:

    标签: android listview keyboard android-edittext hide


    【解决方案1】:

    这听起来像是焦点问题。发生的事情是当应用程序启动时,EditText 获得焦点,并且键盘弹出。您应该尝试使 ListView 获得焦点。这样,在用户点击 EditText 焦点之前,键盘不会弹出。

    在你的 Java 中,你应该得到一个 ListView 的实例,然后调用几个函数:

    ListView listView = findViewById(R.id.list);
    listView.setFocusableInTouchMode(true);
    listView.requestFocus();
    

    如果你把它放在你的 onCreate() 中,焦点将被赋予 ListView,并且他们的键盘在用户点击 EditText 之前不会出现。

    更多详情请见this SO question

    【讨论】:

    • 很抱歉,这也没有用。将此代码放置在您所说的位置(在我的 onCreate 方法中),当布局加载时,键盘就会出现。
    【解决方案2】:

    您可以在 LinearLayout 中添加以下两个属性。

    android:focusable="true"
    android:focusableInTouchMode="true"
    

    【讨论】:

    • 这将是一条更好的路线,但您仍然需要调用 requestFocus() 才能让 ListView 真正获得焦点。
    • @boztalay :ListView 是否需要关注?默认情况下,线性布局只会保持焦点以避免 EditText 获得焦点。所以我觉得这两行应该可以解决问题。
    • 我认为 ListView 不需要焦点,但 EditText 会自动请求它,因此需要以某种方式停止该行为。这两行只会使列表视图具有焦点。
    • 我已经按照你的说法放置了你的代码,但我担心这只会让任何东西都没有出现。确实 EditText 没有聚焦,但 ListView 没有显示。
    【解决方案3】:

    尝试在包含 EditText 的布局中添加:

    android:descendantFocusability="beforeDescendants"
    android:focusableInTouchMode="true"
    

    希望对你有帮助。

    【讨论】:

    • 我已经按照您的说法将您的代码放在了我的 LinearLayout 中,但恐怕这只会导致什么都没有出现。确实 EditText 没有聚焦,但 ListView 没有显示。
    【解决方案4】:

    http://www.mysamplecode.com/2012/02/android-edittext-hide-soft-keyboard.html

    这是我在这里找到的问题的解决方案。不明白为什么 listivew 应该这样做,但解决方法会有所帮助。

    【讨论】:

    • 恐怕这也不能胜任。我想那是因为我有一个需要加载的 listView 而不是一个按钮(如示例中的),因为它直到我按下/聚焦 editText 才会出现。无论如何感谢您的尝试!
    猜你喜欢
    • 1970-01-01
    • 2013-01-12
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 2012-02-18
    • 1970-01-01
    相关资源
    最近更新 更多