【问题标题】:How can I specify or get the resource id of a nativescript textfield如何指定或获取 nativescript 文本字段的资源 ID
【发布时间】:2018-09-13 18:32:47
【问题描述】:

我们正在为我们的移动应用程序使用带有 angular 的 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 中找不到资源。

【问题讨论】:

  • 请看我的回答

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


【解决方案1】:

编辑:原来我误解了 OP 的问题,即“如何将原生 Android 视图 ID 用于 NativeScript 的可视组件”。相反,我回答了“如何在 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 行,其中原生字符串应用于标签对象。

【讨论】:

  • 好的。以及如何将此字符串或数字 id 分配给例如TextField,以便谷歌预启动可以通过给定的id识别文本字段?我在 API 中没有看到任何 setter 或类似的东西。
  • 我将字符串添加到 XML 的视图模型中,然后从 XML 中引用该字符串,因此您的 TextField 不会使用 Android ID 本身,而只是使用字符串。查看github.com/leoacevedo/…的main-view-model.js 和main-page.xml
  • 我不是在寻找那个。我不想将 android 字符串 id 分配给文本字段值,但我想将 id 分配给该字段,以便我可以通过该 id 以编程方式识别该文本字段。
  • 那我误会你了。我会写一个单独的答案来解决这个问题,虽然我不认为使用这些 ID 对你很有用
  • 有人可以展示一个角度的例子吗?上面的解决方案对我不起作用...
【解决方案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 添加到TextFields 和提交按钮。您认为的 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);
}

【讨论】:

【解决方案3】:

如何使用原生 Android ID 作为 NativeScript 可视化组件的 ID

首先,虽然您可以使用 Android 原生 ID 作为 NS ID,但原生 Android 不会对此做任何有用的事情。特别是,如果您使用 Android 的 View.findViewById(),将无法找到带有 Android 原生 ID 的 NS 视图。

NativeScript's source code,定义NativeScript的view ID的文件(view-base.ts)中,找不到原生Android的引用,这意味着NativeScript的view ID和Android的view ID实际上没有任何关系或交互。此外,我使用名为 Stetho 的原生 Android 工具查找 Android 视图 ID,发现 NativeScript 的视图根本没有 ID,即使 NativeScript 的 XML 文件确实定义了视图 ID。

要回答您的问题,有一种方法可以通过使用视图模型将原生 Android ID 提供给 NativeScript。

假设您想在 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,还可以将 text 用作您的 TextField 和标签。如果这样做,您会看到 Android ID 是真正的长整数,而不是字符串。

要记住的另一件事是,Android 上的 R 是收集库或应用程序上所有资源 ID 的类,它是在构建时生成的。因此,如果您想为您的视图提供 ID R.id.totallyNewId,而您的 Android 项目目前没有,您必须在 Android 上创建它,这不是很方便 (here is how)

因此,总而言之,在 NativeScript 上使用 R.id 是可行的,但你没有理由想要这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    相关资源
    最近更新 更多