189

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

4

9 回答 9

369

我相信这里已经回答

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

或者

int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
于 2010-12-17T14:00:15.997 回答
104

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

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

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

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

这些解决方案中的任何一个都允许将版本名称放在 XML 中。不幸的是,没有一个很好的简单解决方案,比如android.R.string.version或类似的东西。

于 2012-12-09T17:59:28.573 回答
79

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

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'
}

然后就可以@string/versionName在 XML 中使用了。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>
于 2016-04-07T06:48:03.887 回答
16

如果您使用 Gradle,则可以使用 build.gradle 文件在编译时以编程方式向 xml 资源添加值。

示例代码提取自: https ://medium.com/@manas/manage-your-android-app-s-versioncode-versionname-with-gradle-7f9c5dcf09bf

buildTypes {
    debug {
        versionNameSuffix ".debug"
        resValue "string", "app_version", "${defaultConfig.versionName}${versionNameSuffix}"
    }
    release {
        resValue "string", "app_version", "${defaultConfig.versionName}"
    }
}

现在@string/app_version根据需要在 XML 中使用

在调试模式下,它将添加.debug到链接文章中描述的版本名称。

于 2018-08-19T02:34:59.833 回答
15

我通过扩展 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>
于 2013-11-23T01:55:32.977 回答
14

我用BuildConfig.VERSION_NAME.toString();. 这和从 packageManager 获取它有什么区别?

抱歉,没有基于 XML 的解决方案对我有用。

于 2016-01-08T05:02:17.750 回答
3

您不能从 XML 中使用它。

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

于 2010-12-17T20:48:21.343 回答
1

最简单的解决方案是使用BuildConfig.

BuildConfig.VERSION_NAME在我的应用程序中使用。

您还可以使用BuildConfig.VERSION_CODE来获取版本代码。

于 2019-06-23T18:31:27.707 回答
-1

游戏迟到了,但你可以不@string/xyz使用?android:attr

    <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"
     />
于 2013-09-09T15:37:05.007 回答