Android中Toolbar或ActionBar選單不現實icon的解決方案
阿新 • • 發佈:2019-01-10
文章目錄
關於Android開發中menu的選項選單不顯示icon的問題處理
在Google的設計理念中,使用頻次高的選單項,可以放在ToolBar或ActionBar中,顯示圖示或文字。而在彈出的更多選項中,並不會顯示出
icon
,儘管我們已經在menu
的layout中配置了android:icon
屬性。
一、普通的menu
佈局
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/location_menu"
android:icon="@drawable/location"
android:title="@string/str_location"
app:showAsAction="always" />
<item
android:id="@+id/map_menu"
android:icon="@drawable/earth"
android:title="@string/str_map"
app:showAsAction="always|withText" />
<item
android:id="@+id/share_menu"
android:icon="@drawable/share"
android:title="@string/str_share"
app: showAsAction="withText" />
<item
android:id="@+id/feedback_menu"
android:icon="@drawable/feedback"
android:title="@string/str_feedback" />
<item
android:id="@+id/about_menu"
android:icon="@drawable/about"
android:title="@string/str_about" />
</menu>
如圖效果在三個點的下彈item
中是不顯示icon圖示的,雖然佈局中已經有了。原因上面說過了,國內開發習慣的問題,都希望顯示icon,所以有以下兩種解決方式
二、解決方案
-
通過反射機制,在
onCreateOptionsMenu
中,反射MenuBuilder
的屬性設定try { Class<?> clazz = Class . forName ("com.android.internal.view.menu.MenuBuilder"); Method m = clazz . getDeclaredMethod ("setOptionalIconsVisible", boolean.class); m.setAccessible(true); m.invoke(menu, true); } catch (Exception e) { e.printStackTrace(); }
**注意:**這裡填寫的
Menu Builder
包名,要和你使用的保持一致。如果使用了androidx
包,則這裡替換為androidx.appcompat.view.menu.MenuBuilder
。 -
Kotlin的反射方式,類似與Java,將以下程式碼放在
onCreateOptionsMenu
的函式中就好//反射,設定icon val clazz = Class.forName("androidx.appcompat.view.menu.MenuBuilder") val m = clazz.getDeclaredMethod("setOptionalIconsVisible", Boolean::class.java) m.isAccessible = true m.invoke(menu, true)
-
變相使用
menu group
的方式,不用程式碼反射,修改menu
的佈局<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/location_menu" android:icon="@drawable/location" android:title="@string/str_location" app:showAsAction="always" /> <item android:id="@+id/map_menu" android:icon="@drawable/earth" android:title="@string/str_map" app:showAsAction="always|withText" /> <!--下面的icon,替換成自定義的 三個點 圖示,或者其他圖示--> <item android:title="" app:showAsAction="always" android:icon="@drawable/ic_menu_more"> <menu> <item android:id="@+id/share_menu" android:icon="@drawable/share" android:title="@string/str_share" app:showAsAction="withText" /> <item android:id="@+id/feedback_menu" android:icon="@drawable/feedback" android:title="@string/str_feedback" /> <item android:id="@+id/about_menu" android:icon="@drawable/about" android:title="@string/str_about" /> </menu> </item> </menu>
效果圖
宣告:以上兩種方案,都不是個人原創,也不記得在Google上搜索的那個網址的了,總之,在此感謝偉大的開源精神!