如何在“首选项”活动中显示应用程序版本?

8

我想在我的应用程序版本中添加内容,并可能在我的SettingsActivity上进行构建。

我正在尝试在我的应用程序中显示“关于手机”样式的活动。但我不知道该怎么做。

我目前在我的preference.xml中使用EditTextPreference,它在单击时调用对话框,但我希望它像这样,其中onClick事件不会产生对话框:

Nexus 5 screenshot

SettingsActivity.java

public class SettingsActivity extends PreferenceActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    addPreferencesFromResource(R.xml.pref_general);
}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);

    LinearLayout root = (LinearLayout)findViewById(android.R.id.list).getParent().getParent().getParent();
    Toolbar bar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.tool_bar, root, false);
    root.addView(bar, 0); // insert at top
    bar.setTitle("Settings");
    bar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();
        }
    });
}

}

pref_general.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:title="Settings">

<PreferenceCategory android:title="About" >
    <EditTextPreference
        android:title="Version"
        android:summary="@string/app_version"
        android:key="prefUsername"/>
</PreferenceCategory>

还有一件事,有没有办法通过xml从gradle获取应用程序和版本号。

我知道我的编码方式很原始,通常我会在strings.xml中手动更新它们,但是为了辩护,我是Android的新手。


3
“我编码的像穴居人一样。” -- 别太自责了,在这里我们见过比这更差的 ;) 参考 这个问题 获取你的应用程序的构建版本号。 - 2Dee
谢谢你的鼓励,兄弟。 - user3137329
3个回答

17
我最终得到了这个。

enter image description here

我选择了这个方法,而不是扩展类或其他什么的

SettingsActivity.java

public class SettingsActivity extends PreferenceActivity {

public static final String TAG = "caveman";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    addPreferencesFromResource(R.xml.pref_general);

    Preference pref = findPreference( "developer" );
    pref.setSummary("Marathon Apps");

    Preference pref1 = findPreference( "version" );
    try {
        pref1.setSummary(appVersion());
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);

    LinearLayout root = (LinearLayout)findViewById(android.R.id.list).getParent().getParent().getParent();
    Toolbar bar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.tool_bar, root, false);
    root.addView(bar, 0); // insert at top
    bar.setTitle("Prism");
    bar.setSubtitle("Settings");
    bar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();
        }
    });
}

public String appVersion() throws PackageManager.NameNotFoundException {
    PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
    String version = pInfo.versionName;
    return version;
}

}

pref_general.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="About">
<PreferenceScreen
    android:title="Developer"
    android:key="developer"
    android:summary="Marathon Apps">
</PreferenceScreen>

<PreferenceScreen
    android:title="Version"
    android:key="version"
    android:summary="1.0">
</PreferenceScreen>
</PreferenceCategory>


</PreferenceScreen>

16

要在不从Java代码读取的情况下直接将版本名称添加到偏好XML中,请将以下内容添加到Gradle文件中:

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

这将使用versionName注入字符串xml值

在偏好设置的xml中,你只需要获取该值即可

<Preference android:title="Version"
    android:summary="@string/versionName">

</Preference>

Gradle文件的完整参考


apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.app"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        vectorDrawables.useSupportLibrary = true
    }

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

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    dataBinding {
        enabled = true
    }
    buildToolsVersion '28.0.3'
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
}

1
@ValOkafor 即使显示错误,在编译和运行后也没有问题。 实际上,“applicationVariants.all { variant -> variant.resValue“string”,“versionName”,variant.versionName}”将在构建时注入变量versionName。因此,不要在Strings xml中添加versionName。 - UdayaLakmal
在查看 preferences.xml 时,Lint 将显示一个投诉:无法解析符号 '@string/versionName' :( 不是很大的问题,但 Google 应该解决这个问题。 - l33t

1
你可以创建自己的自定义偏好设置,重写onClick方法使其不执行任何操作。如果不想从头开始重新做所有事情,甚至可以扩展EditTextPreference

记得在pref_general.xml文件中包括该类的完全限定名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接