以编程方式更改Android元数据值

8
如何在清单文件或字符串资源中以编程方式更改元数据值的字符串值。

可能是Change value of R.string programmatically的重复问题。 - TheWanderer
我想要更改其中一个元数据值或字符串资源。 - Ahmed Wahdan
3个回答

8
使用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 这个链接是关于Android应用程序构建清单文件中的变量的,它可以让你在构建过程中使用不同的值。如果你想了解更多关于如何使用这些变量的信息,请点击上面的链接。

0
当您将信息作为资源(在文件夹res中)提供时,无法以编程方式修改资源。您不能在该目录中写入。Android清单也是如此,清单元数据无法在运行时更改。
最好有两个字符串,例如第一个值和第二个值,这样您就可以直接使用它:
Java:
thing.setText(getResources.getString(R.id.variablename2)) 

Kotlin:

thing.text = resources.getString(R.id.variablename2) 

问题是我在清单上有元数据值,我想要更改它。 - Ahmed Wahdan
你不能在运行时更改元数据,但是你可以设置多个版本,并设置构建以适应应用程序的每个版本。如果你正在寻找更强大的解决方案,我建议设置一个设置服务,它可以让你按照每个客户/组织的要求提供设置。 - Randy

-1

更改元数据可以通过向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,传递包名和meta-data标志。返回的ApplicationInfo包含一个字段metaData,实际上是一个包含所有元数据的Bundle。第4行获取的字符串与XML中的“android:name”参数相同。希望这可以帮助您!


4
你没有展示如何在Java中编辑它们或更改它们。 - Idris Stack
我可以通过编程方式应用/更改活动元数据值吗? - Hardik Paranjape

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接