在偶然发现一些其他讨论和资源之后:
我将在下面回顾这些资源的一些要点。
模板流程
首先,您需要确保您的页面布局如下所示:
ScrollView
> StackLayout
> GridLayout
> SomeElement
> GridLayout
> TextField
Android 软输入模式
这与 UI 中的文本字段获得焦点时显示的屏幕键盘有关。确保键盘不会覆盖您的文本字段的一个技巧是确保您在AndroidManifest.xml 中设置了属性windowSoftInputMode。您可以使用adjustResize 或adjustPan。我不完全确定这些差异,但一些用户报告说其中一个或两个都可以工作,因此您可能需要尝试哪种方法适合您的情况。您可以阅读有关这两个标志的更多信息here。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="__PACKAGE__"
android:versionCode="10000"
android:versionName="1.0">
...
<application
...
android:windowSoftInputMode="stateHidden | adjustPan">
更新 2
我相信 NativeScript 中有一些东西被重置,这会导致当应用程序是 suspended 和 resumed 时,android:windowSoftInputMode 设置的标志被重置。为了解决这个问题,您需要在视图本身的控制器中进行一些调整,以观察这些事件在应用的生命周期中发生,然后追溯启用再次标记。
some-view.component.ts (TypeScript)
import { Component, OnInit } from '@angular/core';
import * as app from "application";
import {
resumeEvent,
suspendEvent,
ApplicationEventData,
on as applicationOn,
run as applicationRun } from "tns-core-modules/application";
declare var android: any; // <- important! avoids namespace issues
@Component({
moduleId: module.id,
selector: 'some-view',
templateUrl: './some-view.component.html',
styleUrls: ['./some-view.component.css']
})
export class SomeViewComponent implements OnInit {
constructor() {
applicationOn(suspendEvent, (args: ApplicationEventData) => {
// args.android is an android activity
if (args.android) {
console.log("SUSPEND Activity: " + args.android);
}
});
applicationOn(resumeEvent, (args: ApplicationEventData) => {
if (args.android) {
console.log("RESUME Activity: " + args.android);
let window = app.android.startActivity.getWindow();
window.setSoftInputMode(
android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN
);
// This can be SOFT_INPUT_ADJUST_PAN
// Or SOFT_INPUT_ADJUST_RESIZE
}
});
}
}