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

Мы используем nativescript с angular для нашего мобильного приложения. Я хочу использовать функцию предварительного отчета 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 можно добавить идентификатор в TextField, добавив атрибут android: id.

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

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


person Paul Weber    schedule 04.04.2018    source источник
comment
Пожалуйста, взгляни на мой ответ   -  person Leo supports Monica Cellio    schedule 16.04.2018


Ответы (3)


Изменить: Оказывается, я неправильно понял вопрос 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'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')

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

person Leo supports Monica Cellio    schedule 15.04.2018
comment
OK. и как бы вы назначили эту строку или числовой идентификатор, например, TextField, чтобы предварительный запуск Google мог идентифицировать текстовое поле по заданному идентификатору? Я не видел в API сеттера или чего-то подобного. - person Paul Weber; 16.04.2018
comment
Я добавил строку в модель представления XML, а затем сослался на эту строку из XML, поэтому ваше поле TextField не будет использовать сам идентификатор Android, а только строку. Взгляните на main-view-model.js и main-page.xml по адресу github.com/leoacevedo/ - person Leo supports Monica Cellio; 16.04.2018
comment
Я этого не ищу. Я не хочу назначать идентификатор строки Android значению текстового поля, но я хочу назначить идентификатор полю, чтобы я мог программно идентифицировать это текстовое поле с помощью этого идентификатора. - person Paul Weber; 17.04.2018
comment
Тогда я вас неправильно понял. Я напишу отдельный ответ по этому поводу, хотя я не думаю, что использование этих идентификаторов будет очень полезно для вас. - person Leo supports Monica Cellio; 18.04.2018
comment
Вот оно. Надеюсь, на этот раз я все понял! :) - person Leo supports Monica Cellio; 18.04.2018
comment
Могу я указать, какой string.xml использовать? - person C.Ikongo; 08.08.2018
comment
@ C.Ikongo просто обычный strings.xml - person Leo supports Monica Cellio; 08.08.2018
comment
Может кто-нибудь показать пример для angular? Решение выше не работает для меня ... - person Mafick; 24.01.2020

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

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

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

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

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

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

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

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

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

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

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

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

person Leo supports Monica Cellio    schedule 18.04.2018

Прежде всего, вам нужно добавить файл 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);
}
person Nicu Surdu    schedule 11.08.2019
comment
Как у вас android.R? это импорт? - person Felipe Centeno; 29.05.2020
comment
@FelipeCenteno android - глобальная переменная в NS docs.nativescript.org/core-concepts/android-runtime/metadata/ - person Nicu Surdu; 30.05.2020