как изменить значение метаданных программно в манифесте или строковом ресурсе в строковом значении
Я хочу изменить одно из них значение метаданных или строковый ресурс
Вы не можете изменить ресурс, когда вы предоставляете информацию в качестве ресурса (в папке res), его нельзя изменить программно, Вы не можете писать в этом каталоге. То же самое и для Android Manifest, метаданные манифеста не могут быть изменены во время выполнения.
Не лучше иметь две строки, например, первое значение и вторую, поэтому вы можете просто использовать это:
Джава:
thing.setText(getResources.getString(R.id.variablename2))
Котлин:
thing.text = resources.getString(R.id.variablename2)
проблема в том, что у меня есть значение метаданных в манифесте, я хочу его изменить
Вы не можете изменить метаданные во время выполнения, но вы можете настроить несколько вариантов и настроить свою сборку для сборки в соответствии с каждой разновидностью приложения. Если вы ищете более надежное решение, я бы порекомендовал настроить службу настройки, которая позволила бы вам задавать настройки для каждого клиента / организации.
Изменить метаданные можно, добавив метаданные в файл AndroidManifest.xml. Позже вы можете получить к нему доступ с помощью Bundle из своей активности. Вот пример.
AndroidManifest.xml
<?xml version = "1.0" encoding = "utf-8"?>
<manifest xmlns:android = "http://schemas.android.com/apk/res/android"
package = "com.example.readmetadata"
android:versionCode = "1"
android:versionName = "1.0">
<application android:icon = "@drawable/icon" android:label = "@string/app_name">
<activity android:name = ".MainMenu" android:label = "@string/app_name">
<intent-filter>
<action android:name = "android.intent.action.MAIN" />
<category android:name = "android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data android:name = "my_api_key" android:value = "mykey123" />
</application>
<uses-sdk android:minSdkVersion = "3" android:targetSdkVersion = "8" />
</manifest>
Для чтения этих метаданных требуется всего несколько строк Java.
try {
ApplicationInfo ai = getPackageManager().getApplicationInfo(activity.getPackageName(), PackageManager.GET_META_DATA);
Bundle bundle = ai.metaData;
String myApiKey = bundle.getString("my_api_key");
} catch (NameNotFoundException e) {
Log.e(TAG, "Failed to load meta-data, NameNotFound: " + e.getMessage());
} catch (NullPointerException e) {
Log.e(TAG, "Failed to load meta-data, NullPointer: " + e.getMessage());
}
Activity расширяет ContextWrapper, у которого есть метод getPackageManager (). Этот метод возвращает PackageManager, который используется для получения ApplicationInfo, передавая имя пакета и флаг метаданных. Возвращенный ApplicationInfo содержит поле metaData, которое на самом деле является Bundle, содержащим все метаданные. Строка 4 извлекает строку, которая совпадает с параметром «android: name» в XML. Надеюсь, это поможет!
Йой не показал, как их редактировать на Java или менять
Могу ли я программно применить / изменить значение метаданных действия?
Используя переменные сборки Inject в манифест, вы можете программно изменять значение метаданных.
В build.gradle
defaultConfig {
manifestPlaceholders = [ senderid:"12345"]
}
buildTypes {
release {
manifestPlaceholders = [ senderid:"56789"]
}
}
В файле манифеста
<meta-data
android:name = "SENDER_ID"
android:value = "${senderid}" />
Ссылка на ссылку: https://developer.android.com/studio/build/manifest-build-variables.html
Возможный дубликат Программно изменить значение R.string