1. 程式人生 > >Android中Toolbar或ActionBar選單不現實icon的解決方案

Android中Toolbar或ActionBar選單不現實icon的解決方案

文章目錄

關於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>

如圖效果common在三個點的下彈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>
    

效果圖icon

宣告:以上兩種方案,都不是個人原創,也不記得在Google上搜索的那個網址的了,總之,在此感謝偉大的開源精神!