将android:versionName设置为对string资源的引用导致模拟器下的NullPointerException

我试图在我的android清单中设置android:versionName作为存储在外部资源文件中的string资源的引用

以下是我的AndroidManifest.xml的摘录:

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.toycorporation" android:versionCode="@integer/version_code" android:versionName="@string/version_name" > 

以及位于我项目的res/values disrectory下的build.xml文件的内容:

 <?xml version="1.0" encoding="utf-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android"> <item type="string" name="build_date">03/15/2012</item> <item type="integer" name="version_code">315281</item> <item type="string" name="version_name">3.15.28.1</item> </resources> 

稍后,我尝试检索版本号以在我的应用程序的“关于”屏幕上显示它。

 PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(),0); Log.d("PackageInfo", "Version name: " + String.valueOf(packageInfo.versionName)); 

问题描述:

当我构build应用程序并自动将其安装在我的HTC设备上时,一切都很完美。 版本名称通过引用传递,并在“关于”屏幕上获取logcat中logging的版本名称值。 但是,当我尝试构build应用程序并在模拟器上启动它时,我会得到null而不是版本名称值。

我已经尝试使用Eclipse和IDEA构build应用程序并将其安装到模拟器。 所以这个问题似乎与IDE没有关系。

更新:

出现了一个额外的东西,它不适用于使用versionNameversionCode 。 应用程序无法部署到Google Play。 出现以下错误:

该文件无效:错误获取'android:versionCode'属性:属性不是一个整数值

Solutions Collecting From Web of "将android:versionName设置为对string资源的引用导致模拟器下的NullPointerException"

我认为这种方法存在一些问题/如何使用它。

1.)如果你可以编译APK并上传到android市场,并使用正确的版本号和名称,那么你可以使用android的资源引用:versionCode =“@ integer / version_code”android:versionName =“@串/ VERSION_NAME”

如果你不能那么你不应该使用rerences。

2.)如果你打算采取这种方法,为什么然后尝试使用getResources()。getString(R.string.version_name)从packageinfo检索它们?

总而言之,除了能够通过构build箱交换资源文件之外,我看不出这种方法的很多优点。 在这种情况下,您可能需要使用后一种方法来填充关于屏幕。

您可以在清单中将versionName设置为对string资源的引用,而不是versionCode。

这应该工作。 在dimensions.xml中添加以下内容。

 <resources> <item name="version_number" format="float" type="dimen">2.8</item> <item name="version_code" format="integer" type="dimen">8</item> </resources> 

在你的清单中添加以下内容。

  android:versionCode="@dimen/version_code" android:versionName="@dimen/version_number"