【问题标题】:Nativescript Android - hide keyboardNativescript Android - 隐藏键盘
【发布时间】:2016-11-21 11:23:30
【问题描述】:

在我的 Nativescript 应用程序中,应用程序从登录页面开始。在 iOS 上一切看起来都不错,但在 android 上,用户名字段被聚焦并且键盘正在显示。有没有办法防止这种情况发生?

到目前为止我已经尝试过:

  • 获取另一个元素(标签)的引用并在页面的 onLoaded 事件中调用 lbl.focus()
  • 获取用户名文本字段的引用并调用 txt.dismissSoftInput() 和 txt.android.clearFocus()

这些都不起作用。页面加载时是否有其他方法可以隐藏键盘?

谢谢

【问题讨论】:

  • 有一个未解决的问题 -github.com/NativeScript/NativeScript/issues/2432 在 GitHub 中存在类似问题,可能会出现解决方法。您还可以查看 repo 中附加的示例项目。
  • 我一直在尝试使用此代码,但在我的情况下它不起作用。我不确定为什么。有什么想法吗?
  • 我查看了您的场景并在本地项目中对其进行了测试,但是 .clearFocus() 对我有用。如果您可以提供有关您的问题的更多信息,或者您可以向我发送可以在本地调试的示例项目,将会有所帮助。

标签: nativescript


【解决方案1】:

我猜用户名字段是文本视图或文本字段。如果是这样,请在 loaded 回调上试试这个:

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

【讨论】:

  • 谢谢 Dinh,我试过了,但由于某种原因它不起作用。是否需要满足其他条件才能使其正常工作?
  • 这只是 NativeScript API 中的 textview 或 textfield 的一种方法,因此它应该可以正常工作。我会尽快做一个测试。
  • Dihn,我最终使用了不同的方法。有关详细信息,请参阅我的答案。感谢您的帮助。
【解决方案2】:

所以我最终实施了不同的解决方案。这可能不是最好的方法,但它在我的案例中起到了作用,我想将它分享给那些面临类似情况的人。

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

    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 为我指明了正确的方向)。据我了解,这是正在发生的事情:

  • 页面加载,我们在仅有的 2 个文本字段上调用 ​​setFocusable(false) 以防止 Android 将焦点设置在它们上
  • 然后我们等待 300 毫秒,让 Android 进行初始化
  • 超时执行时,调用 setFocusableInTouchMode(true) 以使字段获得焦点。

此时页面已加载,没有任何要聚焦的字段且键盘已隐藏。如果用户点击任何字段,就会出现键盘,他们可以照常继续登录。

正如我所提到的,这可能不是最好的或正确的方法,但对我有用。希望这可以节省人们研究问题的时间。

【讨论】:

  • 这似乎是目前唯一合法的方法。叹。感谢您的 sn-p,请使用它!
  • 使用 {N} 版本 3.0.0。似乎是迄今为止唯一的方法。但是,我不得不使用 @ViewChild("email") inputFldEmail: ElementRef;获得视图。
【解决方案3】:

你想在loaded回调中清除字段的焦点:

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

【讨论】:

  • 谢谢埃米尔。我试过: var un = page.getViewById('username'); if (un.android) { un.android.clearFocus();但它不起作用。该字段仍处于选中状态且键盘处于活动状态
  • 我假设你有一个 ID 为 username 的输入。看看我几个月前写的这段代码:github.com/emiloberg/oppna-program-reklistan-app/blob/…
  • 是的,你是对的,'username' 是文本字段的 id。您的代码建议应该有效,但由于某种原因它不是。一定有其他事情发生。
  • 出于调试目的,请尝试将其包装在 setTimeout() 中。还要注意“注意:当视图清除焦点时,框架会尝试将焦点赋予顶部的第一个可聚焦视图。因此,如果此视图是顶部的第一个可以获取焦点的视图,则所有与清除焦点相关的回调将被调用,之后框架将关注此视图。” (developer.android.com/reference/android/view/View.html)
  • 好提示,setTimeout() 有帮助。框架设置焦点,然后代码将其移除。仍然不理想,因为键盘只显示了几分之一秒,但至少在那之后它隐藏了。
【解决方案4】:

结合以上两个技巧怎么样?

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)
   }
}

【讨论】:

    猜你喜欢
    • 2022-08-03
    • 2014-08-07
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    相关资源
    最近更新 更多