Làm cách nào bạn có thể nhận được số Phiên bản rõ ràng nhất từ ​​các biến XML (Bố cục) của ứng dụng?


184

Tôi muốn có một cách để tham chiếu số phiên bản kê khai của dự án trong phần chính của mã. Những gì tôi đã làm cho đến bây giờ là liên kết số phiên bản trong tệp Chuỗi XML với tệp kê khai (@ chuỗi / Phiên bản). Những gì tôi muốn làm là làm theo cách khác, liên kết một biến XML chuỗi với phiên bản trong tệp kê khai. Nguyên nhân? Tôi chỉ muốn thay đổi số phiên bản ở một vị trí, tệp kê khai. Có cách nào để làm điều này? Cảm ơn!


17
Đây KHÔNG phải là một bản sao. Câu hỏi trong câu hỏi hỏi làm thế nào để làm điều tương tự trong CODE, tôi đang hỏi bằng XML. Hai cấu trúc rất khác nhau trong lập trình Android ...
PearsonArtPhoto

Câu trả lời:


367

Tôi tin rằng đã được trả lời ở đây .

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

HOẶC LÀ

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

8
Hầu như, nhưng không hoàn toàn ... Điều tôi muốn làm là tham chiếu nó tới mã XML, nhưng có vẻ như điều đó là không thể, vì vậy ...
PearsonArtPhoto

Cảm ơn bạn rất nhiều!!! Tôi đã tìm kiếm khắp nơi cho điều này:String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
Aaron Klap

1
@Shubh Tôi không nghĩ vậy.
Konstantin Burov

3
Thêm BuildConfig.VERSION_NAME vào câu trả lời của bạn cho các câu chuyện cười.
jobbert

102

Không có cách nào để trực tiếp đưa ra phiên bản, nhưng có hai cách giải quyết có thể được thực hiện.

  1. Phiên bản có thể được lưu trữ trong một chuỗi tài nguyên và được đặt vào tệp kê khai bằng cách:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="com.somepackage"
         android:versionName="@string/version" android:versionCode="20">
  2. Người ta có thể tạo một khung nhìn tùy chỉnh và đặt nó vào XML. Khung nhìn sẽ sử dụng cái này để gán tên:

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

Một trong những giải pháp này sẽ cho phép đặt tên phiên bản trong XML. Thật không may, không có một giải pháp đơn giản tốt đẹp nào, giống như android.R.string.versionhoặc một cái gì đó tương tự.


14
một lưu ý nhỏ cho 1.: nó hoạt động nhưng tôi nghĩ nó đã nản lòng vì tôi nhận được một cảnh báo cho tôi biếtThe android:versionName cannot be a resource url, it must be a literal string
Griddo

1
Những gì tôi đã làm là không để lại tên phiên bản kê khai (nhưng cập nhật nó bất cứ khi nào có bản phát hành mới) và sử dụng chuỗi tệp để lưu trữ giá trị mà tôi sẽ sử dụng trên ứng dụng.
numediaweb

1
Đối với AndroidStudio, tệp kê khai versionNameđược ghi đè bằng một bộ trong build.gradletệp
Adrian C.

66

Bạn có thể sử dụng các versionNametài nguyên XML, chẳng hạn như bố cục hoạt động. Đầu tiên tạo một tài nguyên chuỗi trong app/build.gradlevới đoạn mã sau trong androidnút:

applicationVariants.all { variant ->
    variant.resValue "string", "versionName", variant.versionName
}

Vì vậy, toàn bộ build.gradlenội dung tập tin có thể trông như thế này:

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

Sau đó, bạn có thể sử dụng @string/versionNametrong XML. Android Studio sẽ đánh dấu màu đỏ, nhưng ứng dụng sẽ biên dịch mà không gặp sự cố. Ví dụ: cái này có thể được sử dụng như thế này trong 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
Điều này là tốt hơn so với phong cách lập trình.
Chất dẫn truyền thần kinh

2
Giải pháp tuyệt vời. Cảm ơn rất nhiều.
Samik Bandyopadhyay ngày 7/8/2016

2
Tôi đang sử dụng mới nhất và vẫn còn làm việc cho tôi. Tôi sử dụng cái này và một vài biến khác như thế này. @ k2col bạn gặp lỗi gì khi biên dịch? Xin vui lòng gửi mã lớp của bạn
Arun Shankar

3
Đây nên được coi là câu trả lời tốt nhất.
pepan

15

Tôi đã giải quyết vấn đề này bằng cách mở rộng lớp Ưu tiên.

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);
        }
    }
}

Sau đó, trong XML tùy chọn của tôi:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <com.example.android.VersionPreference android:title="Version" />
</PreferenceScreen>

Giáo sư. Tôi đã phải suy nghĩ XML Preference dựa trên một nhận xét khác.
seastland

Tuy nhiên, tôi sẽ chỉ sao chép và dán câu trả lời của anh ấy.
Mathijs

13

Tôi sử dụng BuildConfig.VERSION_NAME.toString();. Có gì khác biệt giữa cái đó và lấy nó từ packManager?

Không có giải pháp dựa trên XML nào làm việc cho tôi, xin lỗi.


7
BuildConfig.VERSION_NAME đã là một chuỗi, không cần phải gọi tớiString () trên chuỗi đó.
Makotosan

Thói quen. Đủ công bằng
Mullazman

Có những trường hợp khi gọi điều này trong dự án của bạn có thể nhận được kết quả khác với những gì bạn mong đợi. Ví dụ: nếu bạn sử dụng một mô hình con Android trong dự án của bạn và bạn gọi nó từ mã của mô hình con, nó sẽ tham chiếu để xây dựng cấu hình của mô hình con có thể có phiên bản khác nhau. Hoặc nếu bạn gọi nó từ mã của dự án của bạn, bạn có thể tham chiếu nhầm để xây dựng cấu hình của mô hình con của bạn và nhận được kết quả tương tự. Chỉ cần cẩn thận và kiểm tra kỹ xem bạn có tham chiếu đến gói cấu hình phù hợp không.
MikeL

Hãy thử sử dụng hướng dẫn này: Medium.com/@manas/ trộm
CrandellWS

sự khác biệt là BuilConfig được cung cấp bởi Gradle trong khi nhận được nó trong thời gian chạy là bởi PackageManager (HĐH)
Ishaan Kumar

12

NẾU bạn đang sử dụng Gradle, bạn có thể sử dụng tệp build.gradle để lập trình thêm giá trị cho tài nguyên xml theo thời gian biên dịch.

Mã ví dụ được trích xuất từ: 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}"
    }
}

bây giờ sử dụng @string/app_versionkhi cần trong XML

Nó sẽ thêm .debugvào tên phiên bản như mô tả trong bài viết được liên kết khi ở chế độ gỡ lỗi.


1
câu trả lời hay nhất đến nay!!
Raheel Hasan

2

Bạn không thể sử dụng nó từ XML.

Bạn cần mở rộng tiện ích bạn đang sử dụng trong XML và thêm logic để đặt văn bản bằng cách sử dụng những gì được đề cập trong câu trả lời của Konstantin Burov.


Tôi sợ điều đó ... Cảm ơn vì sự giúp đỡ!
PearsonArtPhoto

2
chúng ta có thể sử dụng nó vui lòng kiểm tra câu trả lời của tôi Tôi đang sử dụng nó trong ứng dụng của mình
Arun Shankar

1

Giải pháp dễ nhất là sử dụng BuildConfig .

tôi sử dụng BuildConfig.VERSION_NAME trong ứng dụng của tôi.

Bạn cũng có thể sử dụng BuildConfig.VERSION_CODEđể lấy mã phiên bản.


-3

Muộn trò chơi, nhưng bạn có thể làm điều đó mà không cần @string/xyzsử dụng?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
Tôi sử dụng như thế này : <Preference android:title="Version" android:summary="?android:attr/versionName" ></Preference>, nhưng hiển thị là ?16843292. Điều gì sai?
Suge

Tôi không chắc nhưng nghĩ đây là API sau?
Mafro34

@PearsonArtPhoto thực sự, nó nói ở đâu?
Mafro34

không hoạt động; trả về số vui mà @Suge đã chỉ ra ở trên
pepan

hoàn toàn không hoạt động và trả về giá trị ngẫu nhiên như đã đăng trước đó
A_rmas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.