使用反射機制實現菜單Icon的顯示
一 目標:
記事本中的添加彈出式菜單,實現菜單Icon的顯示。
二、自主學習內容
功能的實現方式:
1.在res中新建menu文件夾-->main.xml文件,如下所示:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.mynote.base_activity"
android:id="@+id/popup_menu"
>
<item
android:id="@+id/red"
android:icon="@drawable/red"
android:title="@string/red_title"
android:orderInCategory="100"
android:showAsAction="never"
/>
<item
android:id="@+id/green"
android:icon="@drawable/green"
android:title="@string/green_title"
android:orderInCategory="100"
android:showAsAction="never"
/>
<item
android:id="@+id/blue"
android:icon="@drawable/blue"
android:title="@string/blue_title"
android:orderInCategory="100"
android:showAsAction="never"
/>
</menu>
2. 在BaseAcitivity.java加載佈局文件過後使用java反射機制的方法解決菜單Icon的顯示,代碼如下所示:
case R.id.color:
Log.d(TAG,"BaseActivity-->onClick-->color");
popupMenu=new PopupMenu(this,color);
getMenuInflater().inflate(R.menu.main, popupMenu.getMenu());
/*popupMenu.getMenu().getItem(0).setIcon(R.drawable.red);
//設置第一個item的圖標爲red圖形資源
popupMenu.getMenu().getItem(1).setIcon(R.drawable.red);
//設置第二個item的圖標爲red圖形資源*/
//MenuBuilder builder = (MenuBuilder) popupMenu.getMenu().getItem(0);
Menu mymenu = popupMenu.getMenu();
try {
Method m = mymenu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
m.setAccessible(true);
m.invoke(mymenu, true);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener()
三、解決的問題:
1. 通過反射機制解決了菜單Icon不顯示的問題;
2. 如何通過反射機制調取子類不同類型的方法或變量。
四、學到了什麼:
1 method.setAccessible(true)方法:AccessibleObject是Method,Field,Constructor的父類,override屬性默認爲false,可調用setAccessible方法改變,
如果設置爲true,則表示可以忽略訪問權限的限制,直接調用;
2 method.invoke(true)方法:執行方法的調用。
五、不足及改善
反射機制之前就有學習過,但是在寫代碼時還是會出現動手能力差的問題在,所以以後還需要加強學習。
記事本中的添加彈出式菜單,實現菜單Icon的顯示。
二、自主學習內容
功能的實現方式:
1.在res中新建menu文件夾-->main.xml文件,如下所示:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.mynote.base_activity"
android:id="@+id/popup_menu"
>
<item
android:id="@+id/red"
android:icon="@drawable/red"
android:title="@string/red_title"
android:orderInCategory="100"
android:showAsAction="never"
/>
<item
android:id="@+id/green"
android:icon="@drawable/green"
android:title="@string/green_title"
android:orderInCategory="100"
android:showAsAction="never"
/>
<item
android:id="@+id/blue"
android:icon="@drawable/blue"
android:title="@string/blue_title"
android:orderInCategory="100"
android:showAsAction="never"
/>
</menu>
2. 在BaseAcitivity.java加載佈局文件過後使用java反射機制的方法解決菜單Icon的顯示,代碼如下所示:
case R.id.color:
Log.d(TAG,"BaseActivity-->onClick-->color");
popupMenu=new PopupMenu(this,color);
getMenuInflater().inflate(R.menu.main, popupMenu.getMenu());
/*popupMenu.getMenu().getItem(0).setIcon(R.drawable.red);
//設置第一個item的圖標爲red圖形資源
popupMenu.getMenu().getItem(1).setIcon(R.drawable.red);
//設置第二個item的圖標爲red圖形資源*/
//MenuBuilder builder = (MenuBuilder) popupMenu.getMenu().getItem(0);
Menu mymenu = popupMenu.getMenu();
try {
Method m = mymenu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
m.setAccessible(true);
m.invoke(mymenu, true);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener()
三、解決的問題:
1. 通過反射機制解決了菜單Icon不顯示的問題;
2. 如何通過反射機制調取子類不同類型的方法或變量。
四、學到了什麼:
1 method.setAccessible(true)方法:AccessibleObject是Method,Field,Constructor的父類,override屬性默認爲false,可調用setAccessible方法改變,
如果設置爲true,則表示可以忽略訪問權限的限制,直接調用;
2 method.invoke(true)方法:執行方法的調用。
五、不足及改善
反射機制之前就有學習過,但是在寫代碼時還是會出現動手能力差的問題在,所以以後還需要加強學習。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.