如何指定或获取本机脚本文本字段的资源ID

时间:2018-04-04 09:02:38

标签: android google-play nativescript angular2-nativescript google-play-console

我们正在使用带有角度的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 &#xf105;" (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中找到该资源。

3 个答案:

答案 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);
}