[android] 앱의 (레이아웃) XML 변수에서 매니페스트 버전 번호를 어떻게 얻을 수 있습니까?

코드의 주요 부분에서 프로젝트의 매니페스트 버전 번호를 참조하는 방법을 원합니다. 지금까지 내가 한 일은 String XML 파일의 버전 번호를 매니페스트 (@ string / Version)에 연결하는 것입니다. 내가하고 싶은 것은 다른 방법으로 문자열 XML 변수를 매니페스트의 버전에 연결하는 것입니다. 이유? 매니페스트 파일 한 위치에서 버전 번호 만 변경하고 싶습니다. 이것을 할 수있는 방법이 있습니까? 감사!



답변

나는 이미 여기에 대답했다고 생각합니다 .

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

또는

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


답변

버전을 직접 가져 오는 방법은 없지만 두 가지 해결 방법이 있습니다.

  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.


답변

versionName활동 레이아웃과 같은 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/versionNameXML에서 사용할 수 있습니다 . 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 기반 솔루션이 효과가 없었습니다. 죄송합니다.


답변

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_versionXML에서 필요에 따라 사용하십시오.

.debug디버그 모드에있을 때 링크 된 기사에 설명 된대로 버전 이름에 추가 됩니다.


답변

XML에서는 사용할 수 없습니다.

XML에서 사용하는 위젯을 확장하고 Konstantin Burov의 답변에 언급 된 내용을 사용하여 텍스트를 설정하는 논리를 추가해야합니다.