NativeScript:访问原生Android API

时间:2016-07-14 14:31:55

标签: nativescript

我仍然无法使用nativescript访问本机平台的东西。这是一个简单的代码片段,我尝试访问本机gui元素并将其添加到页面中:

var PagesModule = require('ui/page');
var Application = require('application');
var StackLayout = require('ui/layouts/stack-layout').StackLayout;

exports.createPage = function createPage(args) {
	var page = new PagesModule.Page;
	page.actionBarHidden = true;
	page.backgroundColor = '#F5F5F5';
	page.backgroundSpanUnderStatusBar = false;
	var textView = new android.widget.TextView(Application.android.currentContext);
	var stackLayout = new StackLayout();
	stackLayout.addChild(textView);
	page.content = stackLayout;
    return page;
}

我认为我在理解nativescript如何与原生平台交互时缺少一些东西。

1 个答案:

答案 0 :(得分:0)

它失败的原因是因为只能将“视图”或“视图”后代分配给“查看”儿童或儿童。

您正在创建一个直接的Android组件;但它不是NS框架的一部分,因此框架不知道如何处理它。创建可视组件时,可以从视图(或其他视图后代)下载组件。 NS版本的代码应该是:

var PagesModule = require('ui/page');
var Application = require('application');
var StackLayout = require('ui/layouts/stack-layout').StackLayout;
vat TextView    = require('ui/text-view').TextView;

exports.createPage = function createPage(args) {
    var page = new PagesModule.Page;
    page.actionBarHidden = true;
    page.backgroundColor = '#F5F5F5';
    page.backgroundSpanUnderStatusBar = false;
    var textView = new TextView();
    var stackLayout = new StackLayout();
    stackLayout.addChild(textView);
    page.content = stackLayout;
    return page;
}

如果您真的想要创建自己的组件,我建议您查看UI / Switch它可能是最简单的例子;但简而言之,您需要对视图进行子类化,在Android上使用函数_createUI来实际创建本机组件,因此最简单的说法是:

 var View = require('ui/core/view').View;

function MyTextView() {
    View.apply(this, arguments);
}
__extends(MyTextView, View);
Object.defineProperty(MyTextView.prototype, "android", {
    get: function () {
        return this._android;
    },
    enumerable: true,
    configurable: true
});
MyTextView.prototype._createUI = function () {
    this._android = new android.widget.TextView(Application.android.currentContext);
};

然后,您可以在第一个代码示例中使用new MyTextView()代替内置new TextView()函数。

请注意这个组件,因为我们没有定义任何额外的辅助函数,要设置和获取文本,你必须做的事情,如

var x = page.GetViewById('myTextId').android.setText("Some Value");

并访问本机底层控件及其android属性。

请注意我在http://fluentreports.com/blog/?p=167(以及关于NS的网站上的许多其他文章)上有一篇关于其中一些内容的完整博客文章