programing

앱(Layout) XML 변수에서 매니페스트 버전 번호를 얻으려면 어떻게 해야 합니까?

mailnote 2023. 9. 13. 22:54
반응형

앱(Layout) XML 변수에서 매니페스트 버전 번호를 얻으려면 어떻게 해야 합니까?

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

버전을 직접 꺼낼 수 있는 방법은 없지만, 두 가지 해결 방법이 있습니다.

  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/versionNameAndroid 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>

Gradle을 사용하는 경우 컴파일 시 build.gradle 파일을 사용하여 xml 리소스에 프로그래밍적으로 값을 추가할 수 있습니다.

다음에서 추출된 코드 예제: https://medium.com/ @manas/manage-your-manages-app-s-version code-version name-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디버그 모드일 때 링크된 문서에 설명된 버전 이름으로.

선호도 클래스를 확장하여 이 문제를 해결했습니다.

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();. 패키지 매니저에서 받는 것과 어떤 점이 다릅니까?

XML 기반 솔루션이 저에게 적용되지 않았습니다. 죄송합니다.

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

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

가장 쉬운 해결책은 사용하는 것입니다.BuildConfig.

사용합니다.BuildConfig.VERSION_NAME

사용할 수도 있습니다.BuildConfig.VERSION_CODE버전 코드를 가져올 수 있습니다.

경기에 늦었지만, 당신은 그것을 필요 없이 할 수 있습니다.@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"
     />

언급URL : https://stackoverflow.com/questions/4471025/how-can-you-get-the-manifest-version-number-from-the-apps-layout-xml-variable

반응형