我们正在使用带有角度的nativescript作为我们的移动应用。我想使用Google Play预启动报告功能,但我们的应用需要输入密码。 Google Play允许指定密码,但您需要一个资源名称,以便测试脚本可以识别密码的放置位置。
如何在视图中或通过后面的代码或通过任何其他方式指定或接收nativescript文本字段的资源名称?
有问题的观点:
<StackLayout class="form">
<GridLayout columns="*,90" rows="50">
<TextField #inviteTx
col="0"
height="50"
autocorrect="false"
returnKeyType="next"
(returnPress)="enter(inviteTx.text)"
class="input input-border"
secure="false"
keyboardType="url">
</TextField>
<Button col="1" height="50" class="btn btn-primary w-full fa" text="START " (tap)="enter(inviteTx.text)"></Button>
</GridLayout>
</StackLayout>
我做了一些研究,发现在原生android中,one could add an id to a TextField by adding an android:id attribute。
<TextView android:id="@+id/nameTextbox"/>
这似乎不适用于nativescript,之后我无法在R.java中找到该资源。
答案 0 :(得分:4)
编辑:原来我误解了OP的问题,即“如何使用NativeScript的可视化组件的原生Android视图ID ”。相反,我回答了问题“如何在NativeScript中使用原生Android字符串”。
我最后在这里单独回答了原始问题,这个答案仍然是关于在NativeScript中使用原生Android字符串,因为我认为这比使用原生Android ID更有用。
如何在NativeScript中使用原生Android字符串
要访问Android原生资源,您可以使用the Util package中的方法getApplication()
和getStringId()
,如下所示:
// This module will give us access to the native Android context
// See https://docs.nativescript.org/core-concepts/utils
var utilsModule = require("tns-core-modules/utils/utils");
// This method receives a native Android string ID name (like "example_string"),
// and it returns a native Android integer ID
const getAndroidStringId = utilsModule.ad.resources.getStringId;
// Android Application object.
// This object's getString() method receives a native Android integer ID,
// and returns an actual Android native string
const androidApp = utilsModule.ad.getApplication()
/*
* @param id: a string with the name of the native ID
* @return : the native Android string with that ID
*/
function getAndroidNativeString(idName) {
var androidId = getAndroidStringId(idName);
return androidApp.getString(androidId);
}
// This is how you use it
const nativeAndroidString = getAndroidNativeString('example_string_id')
我在this repo中设置了一个简单的示例,该示例使用功能代码在nativescript create
的42点击应用的顶部显示Android原生字符串。查看文件app/main-view-model.js,其中字符串从本机Android获取并添加到视图模型,文件app/main-page.xml,第28行,其中本机字符串应用于标签对象。
答案 1 :(得分:2)
如何使用原生Android ID作为NativeScript可视化组件的ID
首先,虽然您可以将Android本机ID用作NS ID,但原生Android不会对此做任何有用的事情。特别是,如果您使用Android的View.findViewById()
,则无法找到具有Android原生ID的NS视图。
在NativeScript's source code中,定义了NativeScript视图ID的文件(view-base.ts),找不到对原生Android的引用,这意味着NativeScript的视图ID与Android的视图ID实际上没有关系或者相互作用。此外,我使用名为Stetho的原生Android工具查找Android视图ID,并发现NativeScript的视图根本没有ID,即使NativeScript的XML文件确实定义了视图ID。
要回答您的问题,可以使用视图模型为NativeScript提供原生Android ID。
假设你想在XML中使用Android“@ + id / nameTextbox”。在Java中,这将转换为R.id.nameTextBox,因此在您的NativeScript XML中编写:
<TextField id="{{R.id.nameTextbox}}"/>
大括号的使用意味着您需要从视图模型中获取R.id.nameTextbox
,因此在视图模型创建功能中添加:
viewModel.R = <your.application.id>.R
是您的Android应用的applicationId,可以在app/App_Resources/Android/app.gradle
找到。
该行使您的R类对您的XML视图可见,因此您可以将R.id中的值不仅用作ID,还用作TextField和标签的text
。如果你这样做,你会发现Android ID实际上是长整数,而不是字符串。
要记住的另一件事是Android上的R是收集库或应用程序上所有资源ID的类,并且它是在构建时生成的。因此,如果您希望为您的视图提供您的Android项目目前没有的ID R.id.totallyNewId
,则必须在Android上创建它,这不是很方便(here is how)
因此,作为结论,可以在NativeScript上使用R.id,但没有理由为什么要这样做。
答案 2 :(得分:2)
首先,您需要添加一个文件app/App_Resources/Android/src/main/res/values/ids.xml
并包含以下内容:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item type="id" name="email_input" />
<item type="id" name="pass_input" />
<item type="id" name="submit_btn" />
</resources>
然后在您的视图中,确保将id
添加到TextField
和提交按钮中。从您的角度来看,id
不必与ids.xml
中的匹配,但是在我的示例中,它们确实匹配:
<Page loaded="loaded">
<TextField id="email_input" />
<TextField secure="true" id="pass_input" />
<Button id="submit_btn" />
</Page>
最后,在您的视图控制器中,使用loaded
方法:
function loaded(args) {
const page = args.object;
const emailInput = page.getViewById("email_input");
const passInput = page.getViewById("pass_input");
const submitBtn = page.getViewById("submit_btn");
emailInput.android.setId(android.R.id.email_input);
passInput.android.setId(android.R.id.pass_input);
submitBtn.android.setId(android.R.id.submit_btn);
}