如何从应用程序的(布局)XML变量中获取清单版本号?


184

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


17
这不是重复的。有问题的问题问如何在CODE中做同样的事情,我是在XML中问。Android编程中的两种截然不同的结构...
PearsonArtPhoto 2013年

Answers:


367

我相信这里已经回答

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

要么

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

8
几乎,但不是完全...我想做的是将其引用为XML代码,但是看起来这不可能,所以……
PearsonArtPhoto 2010年

非常感谢!!!我一直在到处寻找:String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
亚伦·克拉普

1
@舒伯我不这么认为。
康斯坦丁·布罗夫

3
将BuildConfig.VERSION_NAME添加到您的gradle fokes答案中。
Jobbert

102

没有直接发布版本的方法,但是有两种解决方法可以完成。

  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


14
1.的一点说明:它正在工作,但我认为不建议这样做,因为我收到警告告诉我The android:versionName cannot be a resource url, it must be a literal string
Griddo

1
我要做的是保持清单版本名称不变(但只要有新发行版就更新它),然后使用string.xml来存储将在整个应用程序中使用的值。
numediaweb

1
AndroidStudio,清单versionName是覆盖由一组在build.gradle文件
阿德里安C.

66

您可以使用versionNameXML资源,例如活动布局。首先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>

3
@DenisGLmichiganlabs.com/…
阿伦·尚

3
这比编程风格更好。
神经递质

2
很棒的解决方案。万分感谢。
Samik Bandyopadhyay,2016年

2
我使用的是最新版本,但仍然适用于我。我用这个和其他几个这样的变量。@ k2col编译时出现什么错误?请张贴您的gradle密码
Arun Shankar,

3
这应该被认为是最佳答案。
pepan

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>

哎呀。我一定一直在考虑基于另一个注释的“首选项XML”。
seastland

尽管如此,我还是会复制并粘贴他的答案。
Mathijs Segers 2015年

13

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

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


7
BuildConfig.VERSION_NAME已经是一个字符串,无需在其上调用toString()。
Makotosan '16

习惯。足够公平
Mullazman '16

在某些情况下,在项目中调用此方法可能会得到与预期不同的结果。例如,如果您在项目中使用android子模块,并从子模块的代码调用它,它将引用该子模块的构建配置,该配置可能具有不同的版本。或者,如果您从项目代码中调用它,则可能会错误地引用它来构建子模块的配置并获得相同的结果。请注意并仔细检查您是否引用了正确的构建配置包。
MikeL

尝试使用本指南:medium.com/@manas/...
CrandellWS

区别是Grail提供了BuilConfig,而运行时通过PackageManager(OS)获得了它
Ishaan Kumar

12

如果使用的是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在调试模式下,它将添加到链接文章中描述的版本名称。


1
有史以来最好的答案!
Raheel Hasan

2

您不能通过XML使用它。

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


我很害怕...谢谢您的帮助!
PearsonArtPhoto 2010年

2
我们可以使用它。请检查我的答案。我正在我的应用程序中使用它
Arun Shankar

1

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

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

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


-3

游戏晚了,但是您无需@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"
     />

11
我这样使用:<Preference android:title="Version" android:summary="?android:attr/versionName" ></Preference>,但显示为。出?16843292了什么问题?
Suge 2013年

我不确定,但是认为这是为了以后的API?
Mafro34,2013年

@PearsonArtPhoto实际上,它在哪里说呢?
Mafro34,2013年

不起作用;返回@Suge上面指出的有趣数字
pepan

根本不起作用,并返回以前发布的随机值
A_rmas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.