Nativescript Android - 隐藏键盘

3
在我的Nativescript应用程序中,应用程序从登录页面开始。在iOS上一切看起来很好,但在Android上,用户名字段处于聚焦状态且键盘正在显示。有没有办法防止发生这种情况?
到目前为止,我尝试过以下方法:
- 获取另一个元素的引用(一个标签),并在页面的onLoaded事件中调用lbl.focus()。 - 获取用户名文本字段的引用,并调用txt.dismissSoftInput()和txt.android.clearFocus()。
这些都没有起作用。是否有其他方式在页面加载时隐藏键盘?
谢谢

有一个开放问题-https://github.com/NativeScript/NativeScript/issues/2432,GitHub上有类似的问题,并提供了可能的解决方法。您还可以查看存储库中附带的示例项目。 - Nikolay Tsonev
我一直在尝试使用这段代码,但在我的情况下它并没有起作用。我不确定为什么。有什么想法吗? - dpdragnev
我已经审查了你的情况,并在一个本地项目中进行了测试,然而.clearFocus()对我来说是有效的。如果你能提供一些关于你的问题的更多信息,或者如果你能给我发送一个可以在本地调试的示例项目,那将会很有帮助。 - Nikolay Tsonev
4个回答

4

我猜用户名字段是textview或textfield。如果是的话,请在loaded回调中尝试以下操作:

var myTextview = page.getViewById("myTextView");
myTextView.dismissSoftInput();

谢谢Dinh,我试过了但是不知道为什么它没起作用。还有其他需要满足的条件吗? - dpdragnev
这只是NativeScript API中TextView或TextField的方法,所以它应该正常工作。我会尽快进行测试。 - Dean Le
Dihn,我最终采用了另一种方法。请查看我的答案以了解详细信息。感谢您的帮助。 - dpdragnev

4

所以最终我实施了不同的解决方案。这可能不是最好的方法,但在我的情况下它能够达到目的,并且我希望与那些面临类似情况的人分享它。

在页面加载事件中,我包含了以下代码:

    if (page.android) {
        var un = page.getViewById('username');
        var p = page.getViewById('password');
        un.android.setFocusable(false);
        p.android.setFocusable(false);
        setTimeout(function () {
            un.android.setFocusableInTouchMode(true);
            p.android.setFocusableInTouchMode(true);
        }, 300);
    }

关键在于setTimeout函数(感谢Emil Oberg指出正确的方向)。据我所知,以下是发生的事情:
- 页面加载后,我们对唯一的两个文本字段调用setFocusable(false),以防止Android将焦点设置在它们上面。 - 然后等待300毫秒,以允许Android进行初始化。 - 当超时执行时,调用setFocusableInTouchMode(true)以允许字段获得焦点。
此时,页面已加载完成,没有任何字段处于焦点状态,键盘也被隐藏。如果用户点击任何一个字段,则键盘将出现,他们可以像往常一样登录。
正如我所提到的,这可能不是最好或正确的方法,但对我有效。希望这可以为某些人节省研究问题的时间。

1
这似乎是目前唯一合法的方法。叹气。感谢代码片段,我会使用它! - Starwave
使用 {N} 版本 3.0.0 进行开发。目前看来这是唯一的方法。然而,我不得不使用 @ViewChild("email") inputFldEmail: ElementRef; 来获取视图。 - Fabio

3

您希望在loaded回调中清除字段的焦点:

var searchBar = page.getViewById('my-search-bar-id');
if (searchBar.android) {
    searchBar.android.clearFocus();
}

谢谢Emil。我尝试了以下代码: var un = page.getViewById('username'); if (un.android) { un.android.clearFocus(); } 但是它没有起作用。该字段仍然被选中,键盘仍然处于活动状态。 - dpdragnev
你有一个ID为“username”的输入框,我猜测是这样的。看一下我几个月前写的这段代码:https://github.com/emiloberg/oppna-program-reklistan-app/blob/d1bfcc6c0c5da28d50622c75dc210bd61db54d1a/src/app/views/search.js#L100-L106 - Emil Oberg
是的,你说得对,“username”是文本框的ID。你的代码建议应该可以工作,但出于某种原因它没有。肯定还有其他问题存在。 - dpdragnev
好的提示,setTimeout()很有帮助。框架设置焦点,然后代码移除焦点。仍然不是理想的解决方案,因为键盘会显示一小部分时间,但至少之后它会隐藏。 - dpdragnev
你也可以尝试将焦点设置到另一个视图上(不会弹出键盘)。例如:notSearchBar.android.requestFocus() - Emil Oberg
显示剩余2条评论

0

那么将上述两个技巧结合起来呢?

onClear(args) {
      const searchBar = <SearchBar>args.object;
      if (isAndroid && searchBar.android != undefined){//avoid random unpleasant error
         setTimeout(() => { // the key here was this timeout
            searchBar.android.clearFocus();
      }, 1)
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接