2017-02-01 14 views
2

Я играю с функцией Android, shortcut и у меня есть следующий XML:Использование переменных в функции ярлыков Android xml?

<shortcuts 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <shortcut 
     android:shortcutId="some_id" 
     android:enabled="true" 
     android:icon="@drawable/ic_icon" 
     android:shortcutShortLabel="@string/short_label" 
     android:shortcutLongLabel="@string/long_label" 
     tools:targetApi="n_mr1"> 
     <intent 
      android:action="android.intent.action.MAIN" 
      android:targetPackage="my.package" 
      android:targetClass="my.package.MainActivity" /> 
    </shortcut> 
</shortcuts> 

Имея это так, она работает без проблем.

Могу ли я использовать переменные в файле XML ярлыки, как я могу сделать, например, в AndroidManifest.xml:

<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE"/> 

Так что я хотел бы иметь такое же поведение с ярлыками, но почему-то не работает:

<intent 
    android:action="android.intent.action.MAIN" 
    android:targetPackage="${applicationId}" 
    android:targetClass="my.package.MainActivity" /> 

У вас есть идеи, как использовать переменные здесь?

Поэтому я хотел бы сделать это в том, что у нас есть несколько сред с различными именами пакетов: my.package.test, my.package.debug, my.package.hotfix и т.д ...

ответ

1

Есть ли у вас какие-либо идеи, как использовать переменные здесь?

Это не поддерживается в настоящее время. Манифест-заполнители используются в манифестном процессе слияния для манифестаций. Для ресурсов нет эквивалента.

Простейшие решения будут вращаться вокруг создания специализированных типов сборки или продуктов. В вашем случае, похоже, что тип сборки является подходящей моделью. Имея выделенные ярлыки, будет работать XML-ресурс для каждого типа сборки. Теоретически вы можете иметь выделенные строковые ресурсы для каждого типа сборки с идентификатором приложения (например, app_id, настроенным с использованием resValue в Gradle), а затем использовать android:targetPackage="@string/app_id" в одном XML-ресурсе ярлыков. Однако я не уверен, что мы можем использовать там строковые ресурсы.

+1

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

+0

@ktamas: В принципе, возможно создать плагин Gradle, который будет выполнять манифесты замены стиля слияния, которые приводят к ресурсам. Это может занять нечто вроде 'res-template/xml/shortcut.xml' и генерировать правильные XML-ресурсы в' build/generated/'на основе вариантов сборки и предоставленных заполнителей. Я не знаю, что кто-то построил это, и было бы излишним, если бы вы бросили один из них только для этой ситуации. – CommonsWare

+0

Использование строкового ресурса не работает, он будет печатать адрес, а не значение для этого адреса. – for3st

0

Я создал плагин, который сделает возможным использование manifestPlaceholders ресурсов и пригодный с версией 3.0.0 на андроид Gradle плагина

https://github.com/timfreiheit/ResourcePlaceholdersPlugin

SRC/основные/Рез/shortcuts.xml:

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> 
    <shortcut ...> 

     <intent 
      android:action="android.intent.action.VIEW" 
      android:targetClass="com.test.MainActivity" 
      android:targetPackage="${applicationId}"/> 
    </shortcut> 
</shortcuts>