Тема Android не работает с Stripe CardMultilineWidget — react-native-android bridge

#android #stripe-payments #themes #react-native-android

#Android #stripe-платежи #темы #react-native

Вопрос:

Я новичок в мобильной разработке и Android. Я работаю над приложением react native и пытаюсь интегрировать CardMultilineWidget из Stripe Android (через react native bridge). CardMultilineWidget работает нормально, я могу отправлять и получать события на Android и с Android на react native JS. Но единственная проблема в том, что я не смог настроить стиль виджета в машинном коде.

Я пробовал это. Я читаю файл ресурсов с помощью синтаксического анализатора XML и передаю его конструктору CardMultilineWidget для создания виджета с использованием этих атрибутов. Другие атрибуты (например, shouldShowPostalCode), похоже, работают нормально, но не тема.

    XmlPullParser parser = context.getResources().getXml(R.xml.cardinputattributes);
    try {
        parser.next();
        parser.nextTag();
    } catch (Exception e) {
        e.printStackTrace();
    }
    reactContext = context;
    AttributeSet attr = Xml.asAttributeSet(parser);
    cardMultilineWidget = new CardMultilineWidget(context,attr);
  

Я загружаю файл ресурсов xml и создаю виджет, используя набор атрибутов. Но по какой-то причине тема в файле ресурсов не вступает в силу.
Вот файлы ресурсов
Файл ресурсов XML

     <?xml version="1.0" encoding="utf-8"?>
    <com.stripe.android.view.CardMultilineWidget android:id="@ id/cardMultiLineWidget"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:layout_centerVertical="true"
    android:theme="@style/CreditCardTheme"
    android:imeActionLabel="@string/next_action_string"
    app:shouldShowPostalCode="false"
    android:padding="5dp"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" />

    
  

Это файл с файлом XML-ресурсов Theme — Themes

     <?xml version="1.0" encoding="utf-8"?>
    <resources>
    <!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="android:textColor">#FFFFFF</item>
</style>
<style name="CreditCardTheme" parent="StripeBaseTheme">
    <item name="colorPrimary">@color/primary</item>
    <item name="colorPrimaryDark">@color/primaryDark</item>
    <item name="android:textColorHint">@color/lightYellow</item>
    <item name="android:textColorPrimary">@color/primary</item>
    <item name="android:textColorSecondary">@color/primary</item>
    <item name="android:textColor">@color/textPrimary</item>
    <item name="titleTextColor">@color/title</item>
    <item name="colorAccent">@color/accent</item>
    <item name="colorControlNormal">@color/accent</item>
    <item name="colorControlActivated">@color/lightYellow</item>
    <item name="android:editTextColor">@color/textPrimary</item>
    <item name="editTextColor">@color/textPrimary</item>
</style>
    </resources>
  

Независимо от того, какую тему или стиль я даю свойству android: theme, это не сработало.
Вот пользовательский интерфейс из приложения.
Скриншот приложения

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

Редактировать: передача темы в качестве атрибута, похоже, не работает. Я использовал файл макета с данным cardmultilinewidget и раздул его программно с помощью LayoutInflater, и это сработало. Спасибо @wsw за то, что указал мне правильное направление.

Комментарии:

1. Можете ли вы попробовать использовать CreditCardTheme в активности хостинга вместо CardMultilineWidget ?

2. Привет, @wsw, спасибо за комментарий! CardMultilineWidget — это класс, предоставляемый Stripe. Не уверен, что вы имели в виду, используя CreditCardTheme

3. вы определили пользовательскую тему, с именем CreditCardTheme которой вы ее сейчас используете CardMultilineWidget android:theme . Я имел в виду, что вы должны использовать эту тему в Activity, в котором размещается CardMultilienWidget if, если это имеет смысл

4. Да, это имеет смысл. Я попробовал то, что вы сказали, но, поскольку я использую react native, я не могу изменить действие. Поэтому я добавил файл макета с cardmultilinewidget и применил тему к макету, и это сработало. Спасибо за помощь!

5. @Anorak не могли бы вы опубликовать решение ниже? Так что другие разработчики с такой же проблемой (как и я) могут наслаждаться 🙂