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

Posted

技术标签:

【中文标题】如何从应用程序的(布局)XML 变量中获取清单版本号?【英文标题】:How can you get the Manifest Version number from the App's (Layout) XML variables? 【发布时间】:2011-05-27 03:23:55 【问题描述】:

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

【问题讨论】:

这不是重复的。有问题的问题询问如何在 CODE 中做同样的事情,我在 XML 中询问。 android 编程中两种截然不同的结构... 【参考方案1】:

我相信已经回答了here。

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

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

【讨论】:

几乎,但不完全...我想做的是将它引用到 XML 代码,但看起来这可能是不可能的,所以... 非常感谢!!!我一直在到处寻找这个:String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName; @Shubh 我不这么认为。 将 BuildConfig.VERSION_NAME 添加到您对 gradle fokes 的回答中。【参考方案2】:

无法直接获取版本,但有两种解决方法。

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

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="com.somepackage"
         android:versionName="@string/version" android:versionCode="20">
    

    可以创建自定义视图,并将其放入 XML。视图将使用它来分配名称:

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

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

【讨论】:

对 1. 的一点说明:它正在工作,但我认为它不鼓励,因为我收到一条警告告诉我 The android:versionName cannot be a resource url, it must be a literal string 我所做的是保持清单版本名称不变(但在新版本发布时更新它)并使用 string.xml 来存储我将在整个应用程序中使用的值。 对于AndroidStudio,清单versionNamebuild.gradle 文件中的一组覆盖【参考方案3】:

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

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>

【讨论】:

@DenisGL michiganlabs.com/… 这比程序化风格更好。 绝妙的解决方案。非常感谢。 我正在使用最新的并且仍然适用于我。我使用这个和其他几个这样的变量。 @k2col 编译时出现什么错误?请发布你的gradle代码 这应该被认为是最好的答案。【参考方案4】:

如果您使用的是 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"
    

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

在调试模式下,它会在版本名称中添加.debug,如链接文章中所述。

【讨论】:

有史以来最好的答案!【参考方案5】:

我通过扩展 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。 不过,我还是复制粘贴他的答案。【参考方案6】:

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

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

【讨论】:

BuildConfig.VERSION_NAME 已经是一个字符串,不需要调用 toString() 。 习惯。够公平 在某些情况下,在您的项目中调用它可能会得到与您预期不同的结果。例如,如果您在项目中使用 android 子模块并从子模块的代码中调用它,它将引用可能具有不同版本的子模块的构建配置。或者,如果您从项目代码中调用它,您可能会错误地引用来构建子模块的配置并获得相同的结果。请小心并仔细检查您是否引用了正确的构建配置包。 尝试使用本指南:medium.com/@manas/… 区别在于 BuilConfig 是由 Gradle 提供的,而在运行时获取它是由 PackageManager (OS)【参考方案7】:

您不能从 XML 中使用它。

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

【讨论】:

我害怕...谢谢你的帮助! 我们可以使用它。请检查我的答案。我在我的应用程序中使用它【参考方案8】:

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

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

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

【讨论】:

【参考方案9】:

游戏迟到了,但你可以在没有@string/xyz 的情况下使用?android:attr 来做到这一点

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

【讨论】:

我这样使用:&lt;Preference android:title="Version" android:summary="?android:attr/versionName" &gt;&lt;/Preference&gt;,但显示为?16843292。怎么了? 我不确定,但认为这是为以后的 API 准备的? @PearsonArtPhoto 实际上是在哪里说的? 不起作用;返回@Suge 上面指出的有趣数字 根本不起作用并返回之前发布的随机值

以上是关于如何从应用程序的(布局)XML 变量中获取清单版本号?的主要内容,如果未能解决你的问题,请参考以下文章

在代码中获取 android:versionName 清单元素

从xml布局获取格式化的资源字符串

Chrome 扩展清单版本:2 xml

清单适配器和布局 让你的程序更优雅

从 XML 中获取视图

如何从 PHP 中获取远程 JSON 或 XML API 数据并将返回对象分配为 PHP 变量?