好的,每个人都知道要隐藏键盘,您需要实现:

InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);

但这里的大问题是,当用户touch 或 Select 任何其他不是EditText或软键盘的地方时,如何隐藏键盘?

我试着在我的家长Activity上使用onTouchEvent(),但只有当用户在任何其他视图之外touch 并且没有滚动视图时,这才有效.

我试图实现一个touch 、点击、聚焦的监听器,但没有成功.

我甚至试图实现我自己的滚动视图来拦截touch 事件,但我只能获得事件的坐标,而不能获得所点击的视图.

有没有标准的方法可以做到这一点??在iPhone上,这真的很容易.

推荐答案

以下代码片段只是隐藏了键盘:

public static void hideSoftKeyboard(Activity activity) {
    InputMethodManager inputMethodManager = 
        (InputMethodManager) activity.getSystemService(
            Activity.INPUT_METHOD_SERVICE);
    if(inputMethodManager.isAcceptingText()){
        inputMethodManager.hideSoftInputFromWindow(
                activity.getCurrentFocus().getWindowToken(),
                0
        );
    }
}

您可以将其放在实用程序类中,或者如果您在活动中定义它,请避免使用活动参数,或者调用hideSoftKeyboard(this).

最棘手的部分是何时调用它.您可以编写一个方法,在活动中每View次迭代一次,然后判断它是否是instanceof EditText,如果它没有向该组件注册setOnTouchListener,那么所有内容都将就位.如果你想知道怎么做,其实很简单.这就是你要做的,你写了一个递归方法,就像下面这样,实际上你可以用它做任何事情,比如设置自定义字体等等...方法如下

public void setupUI(View view) {

    // Set up touch listener for non-text box views to hide keyboard.
    if (!(view instanceof EditText)) {
        view.setOnTouchListener(new OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                hideSoftKeyboard(MyActivity.this);
                return false;
            }
        });
    }

    //If a layout container, iterate over children and seed recursion.
    if (view instanceof ViewGroup) {
        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            View innerView = ((ViewGroup) view).getChildAt(i);
            setupUI(innerView);
        }
    }
}

就这样,在你的活动中setContentView秒后调用这个方法.如果您想知道将传递什么参数,那么它就是父容器的id.将id分配给父容器,如

<RelativeLayoutPanel android:id="@+id/parent"> ... </RelativeLayout>

setupUI(findViewById(R.id.parent)),仅此而已.

如果您想要有效地使用它,您可以创建一个扩展的Activity并将此方法放入,并使应用程序中的所有其他活动扩展此活动并在onCreate()方法中调用它的setupUI().

希望能有所帮助.

如果使用多个活动,请定义父布局的公共id,如

然后从Activity扩展一个类,在其OnResume()中定义setupUI(findViewById(R.id.main_parent)),并扩展这个类,而不是``Activity in your program


以下是上述函数的Kotlin版本:

@file:JvmName("KeyboardUtils")

fun Activity.hideSoftKeyboard() {
    currentFocus?.let {
        val inputMethodManager = ContextCompat.getSystemService(this, InputMethodManager::class.java)!!
        inputMethodManager.hideSoftInputFromWindow(it.windowToken, 0)
    }
}

Android相关问答推荐

列表的可变状态未正确更新

如何禁用Android 34+版的TileService,但保留以前的版本?

如何在Jetpack Compose中使用Box Composable来实现这种布局?

Kotlin DSL:为什么我可以从Play Store获取发布版本的日志(log)?

Yarn 机器人导致活动未找到,但Gradlew Run工作正常

Android 14上的慢速意图广播交付

在Jetpack Compose中的隐藏状态栏后面绘制

如何在Android中编写挂起函数和stateflow的单元测试

使用Jetpack Compose创建特定于电视的布局

Android studio应用判断无法打开离线数据库

使用 async 向网络发出并行请求并在supervisorScope中处理它们

在本地通知中设置自定义声音

同样的参数值下,为什么requiredSizeIn不等于requiredWidthIn + requiredHeightIn?

具有管理员权限的 Kotlin 中的多用户系统

用作输入参数的 Lambda 函数导致重组

Android apk 不工作

为什么集成React Native时compileSdkVersion错误?

如何正确地将图像上传到 Jetpack Compose 中的 LazyList 中的项目?

如何对齐文本和图标可组合,以便即使在文本溢出后它们也能保持在一起?

Jetpack Compose:如何绘制这样的路径/线