android - 按下后退时强制 EditText 失去焦点

标签 android xamarin.android

当用户按下后退按钮以隐藏键盘时,我试图强制 EditText 控件失去焦点。已经有很多类似的问题了,但是几个小时后,我还是没能解决。

首先,简单介绍一下上下文。我有一个带有自定义项的 ListView。每个项目都有几个 TextView 和一个 EditText。我有一个 AfterTextChanged() 方法保存编辑后的值。如果它有焦点,我有一个样式设置来突出显示该字段。不幸的是,现在更明显的是,当您隐藏(软)键盘时,EditText 实际上并没有失去焦点,我认为这令人困惑。如果没有键盘,我希望 EditText 不被聚焦。

看起来最合理的解决方案是在 Activity 中覆盖 OnBackPressed(),如所述 here .不幸的是,我的方法似乎没有被调用。 IE。该字段仍处于焦点状态,并且函数中的断点不会触发。

同样, Activity 上的 OnKeyUp() 监听器不会触发,并且 Xamarin 似乎不支持 EditText 控件的 OnKeyUp 处理程序。

我并没有试图在创建时抑制键盘或其他任何东西,因此使用任何不可见的控制技巧也无济于事。

很明显,很多人都有这个问题。我相信你们中的一个已经解决了!能否分享一下您的解决方案?

非常感谢! -凯伦

附言我不需要知道如何隐藏键盘。当用户使用后退按钮隐藏键盘时,我需要采取行动。谢谢:)

最佳答案

根据我的经验,按下后退按钮关闭键盘时,onBackPressed()(至少是 Activity 中默认的@Override)通常不会触发。据我所知,它只会在 Back press 启动当前 Activity 的 finish() 时触发。

下面是一种通过监视 View 大小的变化来了解何时显示/隐藏键盘的“hacky”方法。您还必须在 AndroidManifest.xml 中将 Activity 设置为 android:windowSoftInputMode="adjustResize"

final View activityRootView = findViewById("Your main View");
    activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        Rect r = new Rect();
        //r will be populated with the coordinates of your view that area still visible.
        activityRootView.getWindowVisibleDisplayFrame(r);

        int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
        if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
          //Keyboard is shown


        }
        if(heightDiff <= 100) {
            //Keybaord not shown
        }
     }
    });

关于android - 按下后退时强制 EditText 失去焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18197473/

相关文章:

具有自定义布局按钮样式的 Android 对话 appcompat

android - 使用 android MediaPlayer 播放 ogg 流

c# - 升级 Xamarin 表单后按钮无法立即呈现

c# - 如何从 Xamarin 中的 android 项目访问文件

Android 删除的 View 不会被垃圾收集

c# - 如何在 Xamarin.Android 中的小数点分隔符后显示 2 个或 3 个数字?

java - 由于 "No package identifier when getting value of resource number..."而崩溃

android - startActivity 抛出 NullPointerException

Android 模拟器 Mac OSX 卡在屏幕上显示 'ANDROID_'

xamarin.ios - Android 配置文件的 mono 中不存在 Windows 程序集吗?