你怎么能从应用程序的(布局)XMLvariables获得清单版本号?

我想要在代码的主要部分中引用项目的清单版本号。 到目前为止,我一直在做的是将String XML文件中的版本号链接到清单(@ string / Version)。 我想要做的是反过来,将一个stringXMLvariables链接到清单中的版本。 原因? 我只想更改一个位置的版本号,清单文件。 有没有办法做到这一点? 谢谢!

我相信已经在这里回答了 。

String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName; 

要么

 int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode; 

没有办法直接获取版本,但有两个解决方法可以完成。

  1. 版本可以存储在资源string中,并通过以下方式放入清单中:

     <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.somepackage" android:versionName="@string/version" android:versionCode="20"> 
  2. 可以创build一个自定义视图,并将其放置到XML中。 该视图将使用它来分配名称:

     context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName; 

这两种解决scheme都允许将版本名称放在XML中。 不幸的是没有一个很好的简单的解决scheme,像android.R.string.version或类似的东西。

您可以在XML资源中使用versionName ,例如活动布局。 首先在app/build.gradle使用以下代码段在android节点中创build一个string资源:

 applicationVariants.all { variant -> variant.resValue "string", "versionName", variant.versionName } 

所以整个build.gradle文件内容可能如下所示:

 apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion '24.0.0 rc3' defaultConfig { applicationId 'com.example.myapplication' minSdkVersion 15 targetSdkVersion 23 versionCode 17 versionName '0.2.3' jackOptions { enabled true } } applicationVariants.all { variant -> variant.resValue "string", "versionName", variant.versionName } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } productFlavors { } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.3.0' compile 'com.android.support:design:23.3.0' compile 'com.android.support:support-v4:23.3.0' } 

然后你可以在XML中使用@string/versionName 。 Android Studio会将其标记为红色,但该应用程序将无问题地进行编译。 例如,这可以在app/src/main/res/xml/preferences.xml

 <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="About" android:key="pref_key_about"> <Preference android:key="pref_about_build" android:title="Build version" android:summary="@string/versionName" /> </PreferenceCategory> </PreferenceScreen> 

我通过扩展Preference类来解决这个问题。

 package com.example.android; import android.content.Context; import android.preference.Preference; import android.util.AttributeSet; public class VersionPreference extends Preference { public VersionPreference(Context context, AttributeSet attrs) { super(context, attrs); String versionName; final PackageManager packageManager = context.getPackageManager(); if (packageManager != null) { try { PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0); versionName = packageInfo.versionName; } catch (PackageManager.NameNotFoundException e) { versionName = null; } setSummary(versionName); } } } 

然后在我的偏好XML中:

 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <com.example.android.VersionPreference android:title="Version" /> </PreferenceScreen> 

我使用BuildConfig.VERSION_NAME.toString(); 。 那和packageManager有什么区别?

没有基于XML的解决scheme为我工作,对不起。

你不能从XML中使用它。

您需要扩展您在XML中使用的小部件,并添加逻辑以使用Konstantin Burov的答案中提到的内容设置文本。

在游戏后期,但是你可以通过使用?android:attr来使用@string/xyz

  <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="?android:attr/versionName" /> <!-- or --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="?android:attr/versionCode" />