Как я могу указать или получить идентификатор ресурса текстового поля nativescript

Мы используем 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>

Я провел некоторое исследование и выяснил, что в родном андроиде можно добавить id в TextField, добавив атрибут android: id.

<TextView android:id="@+id/nameTextbox"/>

Это, похоже, не работает в nativescript, я не могу найти ресурс в R.java впоследствии.

Ответ 1

Edit: Оказывается, я неправильно понял вопрос OP, который был "как использовать собственный идентификатор вида Android для визуальных компонентов NativeScript". Вместо этого я ответил на вопрос "как использовать собственные Android-строки в NativeScript".

В итоге я ответил на исходный вопрос на отдельный ответ, и этот ответ по-прежнему будет касаться использования собственных строк Android в NativeScript, потому что я думаю, что это более полезно, чем использование собственных идентификаторов Android.

Как использовать собственные строки Android в NativeScript

Для доступа к собственным ресурсам Android вы можете использовать методы getApplication() и getStringId() из пакета Util, например:

// 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 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')

Я установил простой пример в этом репо, который использует код функции для отображения собственной строки Android в верхней части приложения с 42-кликом из nativescript create. Посмотрите файл app/main-view-model.js, где строка, полученная из собственного Android, добавлена в модель представления и файл app/main-page.xml, строка 28, где родная строка применяется к объекту метки,

Ответ 2

Как использовать собственный идентификатор Android в качестве идентификатора для визуальных компонентов NativeScript

Во-первых, в то время как вы можете использовать собственные идентификаторы Android как NS ID, родной Android не будет ничего полезного в этом. В частности, ваш NS-просмотр с View.findViewById() идентификатором Android не будет найден, если вы используете Android View.findViewById().

В исходном коде NativeScript файл, в котором определяется идентификатор представления NativeScript (view-base.ts), не может быть найдена ссылка на собственный Android, что означает, что идентификатор представления NativeScript и теги Android не имеют никаких отношений или взаимодействия. Более того, я искал идентификатор Android Android с помощью собственного инструмента Android под названием Stetho и обнаружил, что представления NativeScript вообще не имеют идентификатора, даже если файлы XML NativeScript определяют идентификаторы вида.

Чтобы ответить на ваш вопрос, есть способ предоставить собственный идентификатор Android для NativeScript, используя модели просмотра.

Предположим, что вы хотите использовать Android "@+id/nameTextbox" в XML. В Java, который будет транслировать в R.id.nameTextBox, поэтому в вашем NativeScript XML вы пишете:

<TextField id="{{R.id.nameTextbox}}"/>

Использование фигурных скобок означает, что вам нужно получить R.id.nameTextbox из модели представления, поэтому в функции создания модели представления вы добавляете:

viewModel.R = <your.application.id>.R

это приложение вашего Android-приложения, которое вы можете найти в app/App_Resources/Android/app.gradle.

Эта строка делает ваш класс R видимым для ваших представлений XML, поэтому вы можете использовать значения в R.id не только как идентификатор, но также как text для ваших text полей и меток. Если вы это сделаете, вы увидите, что идентификатор Android действительно длинный целых чисел, а не строк.

Еще одна вещь, о которой следует помнить, - это то, что R на Android - это класс, который собирает все идентификатор ресурса в библиотеке или приложении и генерируется во время сборки. Поэтому, если вы хотите дать свое представление ID R.id.totallyNewId, которого сейчас нет в вашем Android-проекте, вам нужно будет создать его на Android, что не очень удобно (вот как)

Таким образом, можно сделать вывод, что использование R.id на NativeScript может быть сделано, но нет причин, почему вы когда-либо захотите это сделать.