Android 菜单图标不会出现在发布版本中,但会显示在调试版本中
Android Menu icons don't appear in the release build but display in the debug build
我面临着近来最奇怪的问题之一。我正在使用具有 android 支持 v7 的 AppCompatActivity。当我 运行 应用程序处于调试模式时,我可以看到带有图标的菜单,生成签名的 apk 并安装后,图标从菜单中消失。
1) Release Build screenshot
2) Debug build screenshot
这是我的菜单代码
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" tools:context=".TerminalActivity">
<item android:id="@+id/action_streamConnect"
app:showAsAction="never"
android:icon="@mipmap/ic_stream"
android:visible="false"
android:title="Connect to Stream">
</item>
<item android:id="@+id/action_connect"
app:showAsAction="never"
android:icon="@mipmap/ic_bluetooth_connect"
android:visible="true"
android:title="@string/action_connect">
</item>
<item android:id="@+id/action_disconnect"
android:title="@string/action_disconnect"
android:icon="@mipmap/ic_bluetooth_disconnect"
android:visible="false"
app:showAsAction="never" />
<item android:id="@+id/action_pulse"
android:title="Start Pulse"
android:icon="@mipmap/finger"
android:visible="true"
app:showAsAction="never" />
<item android:id="@+id/action_resp"
android:title="Respiration"
android:checkable="true"
android:checked="false"
android:visible="true"
android:icon="@mipmap/ic_lungs"
app:showAsAction="never" />
<item android:id="@+id/action_activity"
android:title="Track Activity"
android:checkable="true"
android:checked="false"
android:visible="true"
android:icon="@mipmap/icon_activity_track"
app:showAsAction="never" />
<item android:id="@+id/action_myRecords"
android:title="My Records"
android:visible="true"
android:icon="@mipmap/ic_download"
app:showAsAction="never" />
<item android:id="@+id/action_customUrlAnalyze"
android:title="Analyze Record"
android:visible="true"
android:icon="@mipmap/ic_link"
app:showAsAction="never" />
<item android:id="@+id/action_settings"
android:title="Settings"
android:visible="true"
android:icon="@mipmap/ic_settings_black_24dp"
app:showAsAction="never"
>
</item>
<item android:id="@+id/action_crlf"
android:title="@string/action_crlf"
android:checkable="true"
android:checked="false"
android:visible="false"
app:showAsAction="never" />
<item android:id="@+id/action_customer"
android:title="Link Aadhar"
android:icon="@mipmap/ic_card"
app:showAsAction="collapseActionView"/>
<item android:id="@+id/action_bank"
android:title="Policy Purchase"
android:visible="false"
app:showAsAction="collapseActionView"/>
<item android:id="@+id/action_buy"
android:title="Get Device"
android:visible="true"
android:icon="@mipmap/ic_shopping_cart_black_24dp"
app:showAsAction="never" />
我使用自定义主题。这是我的主题风格
<style name="AppTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorAccent">@android:color/holo_blue_light</item>
<item name="android:colorPrimary">@android:color/holo_blue_light</item>
<item name="android:windowBackground">@android:color/background_light</item>
<item name="android:windowActionBar">true</item>
</style>
我在 AndroidManifest 中包含了这个 AppTheme。我还检查了我是否使用了多个启动器意图
请查看清单
<application
android:allowBackup="true"
android:icon="@mipmap/logo"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".TerminalActivity"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@style/AppTheme" >
<intent-filter>
<action android:name="android.intent.action.DEFAULT" />
</intent-filter>
</activity>
</application>
在未能获得任何解决方案或理解我做错了什么之后,我尝试按照几个 Stack overflow 答案中的说明进行操作。
以下是我随机做的一些事情:
修改了dimens.xml
中的默认图标大小
<dimen name="design_navigation_icon_size" tools:override="true">24dp</dimen>
我所有的菜单图标都是 24dp。我认为这可能是个问题,因为 Android 可能希望 mdpi 有一个 48dp 的图标。所以我通过用甚至 48x48 图标大小甚至 96x96 大小替换几个图标来检查。
我尝试在运行时检查图标的颜色以查看图标是否重绘。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_terminal, menu);
for(int i = 0; i < menu.size(); i++){
Drawable drawable = menu.getItem(i).getIcon();
if(drawable != null) {
drawable.mutate();
drawable.setColorFilter(Color.BLUE, PorterDuff.Mode.SRC_ATOP);
}
}
actionConnect = menu.findItem(R.id.action_connect);
actionDisconnect = menu.findItem(R.id.action_disconnect);
camPulseMenu= menu.findItem(R.id.action_pulse);
menuActivityTracking= menu.findItem(R.id.action_activity);
this.menu=menu;
return true;
}
在我的调试中一切正常,但在发布版本中none。
我还尝试更改 gradle 中的发布设置。这是我的完整 gradle
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com.rupam.biosignal"
minSdkVersion 21
targetSdkVersion 23
versionCode 5
versionName "1.5"
generatedDensities = []
}
aaptOptions {
additionalParameters "--no-version-vectors"
}
buildTypes {
release {
minifyEnabled false
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
shrinkResources true
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.macroyau:blue2serial:0.1.5'
compile 'com.github.PhilJay:MPAndroidChart:v3.0.1'
compile 'com.microsoft.projectoxford:face:1.2.5'
compile 'com.nabinbhandari.android.utils.permissions:android-permissions:1.0'
compile files('libs/dropbox-android-sdk-1.6.3.jar')
compile files('libs/json_simple-1.1.jar')
compile files('libs/org.eclipse.paho.client.mqttv3-1.0.2.jar')
}
repositories {
maven {
url "http://dl.bintray.com/macroyau/maven"
}
}
我的 activity 扩展了 AppCompatActivity。
我知道我犯了一些愚蠢的错误,但找不到。
有人可以帮我理解这里出了什么问题吗?为什么菜单中没有图标?
PS:我测试了三星 Galaxy、Moto G、ViVO 和大约 7-8 种此类设备,但没有任何运气。
您是Shrinking您在发布版本中的资源。
请尝试使用正常的构建类型:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
}
}
-keep class android.support.v7.** { *; }
在 proguard-rules.pro 文件中添加这个
经过一些研究后,它似乎与样式或 XML 标签 app:showAsAction="always"
或缩小或启用 minifyenabled 无关
问题出在显示菜单
时的代码inflation
下面的代码解决了这个问题
val menuHelper: Any
val argTypes: Array<Class<*>?>
try {
val fMenuHelper = PopupMenu::class.java.getDeclaredField("mPopup")
fMenuHelper.isAccessible = true
menuHelper = fMenuHelper[popupMenu]
argTypes = arrayOf(Boolean::class.javaPrimitiveType)
menuHelper.javaClass.getDeclaredMethod("setForceShowIcon",
*argTypes).invoke(menuHelper, true)
} catch (e: Exception) {
e.printStackTrace()
}
我面临着近来最奇怪的问题之一。我正在使用具有 android 支持 v7 的 AppCompatActivity。当我 运行 应用程序处于调试模式时,我可以看到带有图标的菜单,生成签名的 apk 并安装后,图标从菜单中消失。
1) Release Build screenshot
2) Debug build screenshot
这是我的菜单代码
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" tools:context=".TerminalActivity">
<item android:id="@+id/action_streamConnect"
app:showAsAction="never"
android:icon="@mipmap/ic_stream"
android:visible="false"
android:title="Connect to Stream">
</item>
<item android:id="@+id/action_connect"
app:showAsAction="never"
android:icon="@mipmap/ic_bluetooth_connect"
android:visible="true"
android:title="@string/action_connect">
</item>
<item android:id="@+id/action_disconnect"
android:title="@string/action_disconnect"
android:icon="@mipmap/ic_bluetooth_disconnect"
android:visible="false"
app:showAsAction="never" />
<item android:id="@+id/action_pulse"
android:title="Start Pulse"
android:icon="@mipmap/finger"
android:visible="true"
app:showAsAction="never" />
<item android:id="@+id/action_resp"
android:title="Respiration"
android:checkable="true"
android:checked="false"
android:visible="true"
android:icon="@mipmap/ic_lungs"
app:showAsAction="never" />
<item android:id="@+id/action_activity"
android:title="Track Activity"
android:checkable="true"
android:checked="false"
android:visible="true"
android:icon="@mipmap/icon_activity_track"
app:showAsAction="never" />
<item android:id="@+id/action_myRecords"
android:title="My Records"
android:visible="true"
android:icon="@mipmap/ic_download"
app:showAsAction="never" />
<item android:id="@+id/action_customUrlAnalyze"
android:title="Analyze Record"
android:visible="true"
android:icon="@mipmap/ic_link"
app:showAsAction="never" />
<item android:id="@+id/action_settings"
android:title="Settings"
android:visible="true"
android:icon="@mipmap/ic_settings_black_24dp"
app:showAsAction="never"
>
</item>
<item android:id="@+id/action_crlf"
android:title="@string/action_crlf"
android:checkable="true"
android:checked="false"
android:visible="false"
app:showAsAction="never" />
<item android:id="@+id/action_customer"
android:title="Link Aadhar"
android:icon="@mipmap/ic_card"
app:showAsAction="collapseActionView"/>
<item android:id="@+id/action_bank"
android:title="Policy Purchase"
android:visible="false"
app:showAsAction="collapseActionView"/>
<item android:id="@+id/action_buy"
android:title="Get Device"
android:visible="true"
android:icon="@mipmap/ic_shopping_cart_black_24dp"
app:showAsAction="never" />
我使用自定义主题。这是我的主题风格
<style name="AppTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorAccent">@android:color/holo_blue_light</item>
<item name="android:colorPrimary">@android:color/holo_blue_light</item>
<item name="android:windowBackground">@android:color/background_light</item>
<item name="android:windowActionBar">true</item>
</style>
我在 AndroidManifest 中包含了这个 AppTheme。我还检查了我是否使用了多个启动器意图 请查看清单
<application
android:allowBackup="true"
android:icon="@mipmap/logo"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".TerminalActivity"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@style/AppTheme" >
<intent-filter>
<action android:name="android.intent.action.DEFAULT" />
</intent-filter>
</activity>
</application>
在未能获得任何解决方案或理解我做错了什么之后,我尝试按照几个 Stack overflow 答案中的说明进行操作。
以下是我随机做的一些事情:
修改了dimens.xml
中的默认图标大小 <dimen name="design_navigation_icon_size" tools:override="true">24dp</dimen>
我所有的菜单图标都是 24dp。我认为这可能是个问题,因为 Android 可能希望 mdpi 有一个 48dp 的图标。所以我通过用甚至 48x48 图标大小甚至 96x96 大小替换几个图标来检查。
我尝试在运行时检查图标的颜色以查看图标是否重绘。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_terminal, menu);
for(int i = 0; i < menu.size(); i++){
Drawable drawable = menu.getItem(i).getIcon();
if(drawable != null) {
drawable.mutate();
drawable.setColorFilter(Color.BLUE, PorterDuff.Mode.SRC_ATOP);
}
}
actionConnect = menu.findItem(R.id.action_connect);
actionDisconnect = menu.findItem(R.id.action_disconnect);
camPulseMenu= menu.findItem(R.id.action_pulse);
menuActivityTracking= menu.findItem(R.id.action_activity);
this.menu=menu;
return true;
}
在我的调试中一切正常,但在发布版本中none。
我还尝试更改 gradle 中的发布设置。这是我的完整 gradle
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com.rupam.biosignal"
minSdkVersion 21
targetSdkVersion 23
versionCode 5
versionName "1.5"
generatedDensities = []
}
aaptOptions {
additionalParameters "--no-version-vectors"
}
buildTypes {
release {
minifyEnabled false
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
shrinkResources true
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.macroyau:blue2serial:0.1.5'
compile 'com.github.PhilJay:MPAndroidChart:v3.0.1'
compile 'com.microsoft.projectoxford:face:1.2.5'
compile 'com.nabinbhandari.android.utils.permissions:android-permissions:1.0'
compile files('libs/dropbox-android-sdk-1.6.3.jar')
compile files('libs/json_simple-1.1.jar')
compile files('libs/org.eclipse.paho.client.mqttv3-1.0.2.jar')
}
repositories {
maven {
url "http://dl.bintray.com/macroyau/maven"
}
}
我的 activity 扩展了 AppCompatActivity。
我知道我犯了一些愚蠢的错误,但找不到。
有人可以帮我理解这里出了什么问题吗?为什么菜单中没有图标?
PS:我测试了三星 Galaxy、Moto G、ViVO 和大约 7-8 种此类设备,但没有任何运气。
您是Shrinking您在发布版本中的资源。
请尝试使用正常的构建类型:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
}
}
-keep class android.support.v7.** { *; }
在 proguard-rules.pro 文件中添加这个
经过一些研究后,它似乎与样式或 XML 标签 app:showAsAction="always"
或缩小或启用 minifyenabled 无关
问题出在显示菜单
下面的代码解决了这个问题
val menuHelper: Any
val argTypes: Array<Class<*>?>
try {
val fMenuHelper = PopupMenu::class.java.getDeclaredField("mPopup")
fMenuHelper.isAccessible = true
menuHelper = fMenuHelper[popupMenu]
argTypes = arrayOf(Boolean::class.javaPrimitiveType)
menuHelper.javaClass.getDeclaredMethod("setForceShowIcon",
*argTypes).invoke(menuHelper, true)
} catch (e: Exception) {
e.printStackTrace()
}