Мы используем 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 " (tap) = "enter(inviteTx.text)"></Button>
</GridLayout>
</StackLayout>
Я провел небольшое исследование и обнаружил, что в родном Android можно добавить идентификатор в TextField, добавив атрибут android: id.
<TextView android:id = "@+id/nameTextbox"/>
Похоже, это не работает в nativescript, после этого я не могу найти ресурс в R.java.
Редактировать: Оказывается, я неправильно понял вопрос 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 сеттера или чего-то подобного.
Я добавил строку в модель представления XML, а затем сослался на эту строку из XML, поэтому ваше поле TextField не будет использовать сам идентификатор Android, а только строку. Взгляните на main-view-model.js и main-page.xml на github.com/leoacevedo/…
Я этого не ищу. Я не хочу назначать идентификатор строки Android значению текстового поля, но я хочу назначить идентификатор полю, чтобы я мог программно идентифицировать это текстовое поле с помощью этого идентификатора.
Тогда я вас неправильно понял. Я напишу отдельный ответ по этому поводу, хотя я не думаю, что использование этих идентификаторов будет очень полезно для вас.
Вот оно. Надеюсь, на этот раз я все понял! :)
Могу ли я указать, какой файл string.xml использовать?
@ C.Ikongo просто обычный strings.xml
Может кто-нибудь показать пример для angular? Решение выше не работает для меня ...
Как использовать собственные идентификаторы 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? это импорт?
@FelipeCenteno android - глобальная переменная в NS docs.nativescript.org/core-concepts/android-runtime/metadata /…
Пожалуйста, взгляни на мой ответ