Как я могу указать или получить идентификатор ресурса текстового поля 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.

Пожалуйста, взгляни на мой ответ

Leo supports Monica Cellio 16.04.2018 04:59
14
1
2 428
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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. Посмотрите на файл приложение / основной-просмотр-модель.js, где строка получена из собственного Android и добавлена ​​к модели представления, и файл приложение / главная-страница.xml, строка 28, где собственная строка применяется к объекту метки.

ОК. и как бы вы назначили эту строку или числовой идентификатор, например, TextField, чтобы предварительный запуск Google мог идентифицировать текстовое поле по заданному идентификатору? Я не видел в API сеттера или чего-то подобного.

Paul Weber 16.04.2018 14:54

Я добавил строку в модель представления XML, а затем сослался на эту строку из XML, поэтому ваше поле TextField не будет использовать сам идентификатор Android, а только строку. Взгляните на main-view-model.js и main-page.xml на github.com/leoacevedo/…

Leo supports Monica Cellio 16.04.2018 19:07

Я этого не ищу. Я не хочу назначать идентификатор строки Android значению текстового поля, но я хочу назначить идентификатор полю, чтобы я мог программно идентифицировать это текстовое поле с помощью этого идентификатора.

Paul Weber 17.04.2018 15:51

Тогда я вас неправильно понял. Я напишу отдельный ответ по этому поводу, хотя я не думаю, что использование этих идентификаторов будет очень полезно для вас.

Leo supports Monica Cellio 18.04.2018 07:01

Вот оно. Надеюсь, на этот раз я все понял! :)

Leo supports Monica Cellio 18.04.2018 07:36

Могу ли я указать, какой файл string.xml использовать?

C.Ikongo 08.08.2018 02:13

@ C.Ikongo просто обычный strings.xml

Leo supports Monica Cellio 08.08.2018 09:00

Может кто-нибудь показать пример для angular? Решение выше не работает для меня ...

Mafick 23.01.2020 22:05

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

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

В Исходный код NativeScript, файле, в котором определены идентификаторы представления NativeScript (view-base.ts), нельзя найти ссылку на собственный Android, что означает, что идентификаторы представления NativeScript и 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

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

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

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

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

Прежде всего, вам необходимо добавить файл 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);
}

Как у вас android.R? это импорт?

Felipe Centeno 29.05.2020 21:42

@FelipeCenteno android - глобальная переменная в NS docs.nativescript.org/core-concepts/android-runtime/metadata‌ /…

Nicu Surdu 30.05.2020 02:37

Другие вопросы по теме