当用户在 Android 中触摸(外部)、滚动或单击(其他视图)时,在滚动视图中隐藏键盘

Hide keyboard in Scrollview when user touches (outside), scrolls or clicks (other views) in Android

这可能看起来像是一个多余且已经回答的查询,但我被卡住了。我浏览了之前分享的大量回复,但 none 结果证明是一个整体解决方案。

下面是主要 activity xml 的样子:

<RelativeLayout >

    <include
        android:id="@+id/toolbar"
        layout="@layout/toolbar" />

    <ScrollView >

        <LinearLayout >

            <android.support.v7.widget.CardView >

                <LinearLayout >

                </LinearLayout>

            </android.support.v7.widget.CardView>

            <android.support.v7.widget.CardView >

            </android.support.v7.widget.CardView>

        </LinearLayout>

    </ScrollView>

</RelativeLayout>

<android.support.design.widget.NavigationView />

问题

第一个卡片视图的子线性布局中有一个编辑文本视图。截至目前,如果我点击它,键盘会弹出,但当我点击其他地方或滚动页面或点击任何其他视图时键盘不会隐藏(有一个下拉菜单)。

我打算做的是隐藏键盘, 1. 我在编辑文本视图之外的任意位置单击。 2. 滚动页面。 3. 与其他视图交互(下拉)。

尝试过的可能解决方案

how to dismiss keyboard from editText when placed in scroll view - 这个对我来说根本不起作用。

How to hide soft keyboard on android after clicking outside EditText? - 来自@vida 的一种解决方案部分起作用,因为在外部单击时,键盘确实消失了。但话又说回来,这只是我想要实现的部分解决方案。

如果有人可以分享一个解决方案(或过程)来解决这个问题,我将不胜感激。谢谢!

您可以尝试覆盖滚动视图 onClickListener 以在用户每次单击应用程序的任何位置时调用此方法。如果这不起作用,只需将外部相对布局设置为可点击,每次点击布局时,您都可以调用此 hideKeyboard 方法!

public void hideKeyboard(View view) {
   InputMethodManager im =(InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
   im.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

首先,扩展 EditText 并添加一段代码,帮助在每次 EditText 实例失去焦点时关闭键盘

public class MyEditText extends AppCompatEditText {

public MyEditText(Context context) {
    super(context);
    setupEditText();
}

public MyEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
    setupEditText();
}

public MyEditText(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    setupEditText();
}

public void setupEditText() {
    // Any time edit text instances lose their focus, dismiss the keyboard!
    setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus && !(findFocus() instanceof MyEditText)) {
                hideKeyboard(v);
            } else {
                showKeyboard(v);
            }
        }
    });
}

public void hideKeyboard(View view) {
    InputMethodManager inputMethodManager = (InputMethodManager) getContext().getSystemService(Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

public void showKeyboard(View view) {
    InputMethodManager inputMethodManager = (InputMethodManager) getContext().getSystemService(Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.showSoftInput(view, 0);
}
}

然后,在您的 ScrollView 的子布局中设置android:clickable="true"android:focusableInTouchMode="true"

请注意,应该是ScrollView的子布局,而不是ScrollView本身。

<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:focusableInTouchMode="true"
    android:orientation="vertical">

    <MyEditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    </MyEditText>

</LinearLayout>

</ScrollView>

应该可以!