optionMenu如何弹出
来源:互联网 发布:最难的网络游戏知乎 编辑:程序博客网 时间:2024/05/17 05:02
1.我们通过工具抓取的是
ListMenuPresenter.java2.通过分析得到
3.ListMenuPresenter.java (里面包含BaseAdapter)--> ExpandedMenuView.java extends ListView --> ListMenuItemView.javaListMenuItemView.java extends LinearLayout implements MenuView.ItemView通过这个我们知道ListMenuPresenter.java文件只是在MenuDialogHelper.java 文件和PhoneWindows.java文件里面使用。先看MenuDialogHelper.java文件MenuDialogHelper.java :Helper for menus that appear as Dialogs (context and submenus).
就是将optionmenu中的item通过AlertDialog 的方式呈现
@Override在调用subMenu的时候,是通过dialog的方式。
public boolean onSubMenuSelected(SubMenuBuilder subMenu) {
if (!subMenu.hasVisibleItems()) return false;
// The window manager will give us a token.
new MenuDialogHelper(subMenu).show(null);
if (mCallback != null) {
mCallback.onOpenSubMenu(subMenu);
}
return true;
}然后分析PhoneWhindow.java
MenuView getListMenuView(Context context, MenuPresenter.Callback cb) {
if (menu == null) return null;
if (!isCompact) {
getIconMenuView(context, cb); // Need this initialized to know where our offset goes
}
if (listMenuPresenter == null) {
listMenuPresenter = new ListMenuPresenter(
R.layout.list_menu_item_layout, listPresenterTheme);
listMenuPresenter.setCallback(cb);
listMenuPresenter.setId(R.id.list_menu_presenter);
menu.addMenuPresenter(listMenuPresenter);
}
if (iconMenuPresenter != null) {
listMenuPresenter.setItemIndexOffset(
iconMenuPresenter.getNumActualItemsShown());
}
MenuView result = listMenuPresenter.getMenuView(decorView);
return result;
}这边可以看出来R.layout.list_menu_item_layout 问价加载并且设置了 listPresenterTheme 的属性。
最后的listMenuPresenter.getMenuView(decorView);就是将这个View 加入到decorView 这个root节点中。
4.所以看到这边也就大体清晰了,然后我们看一下这个result的作用。
通过查看result我们得到:
protected boolean initializePanelContent(PanelFeatureState st) {
......
if (mPanelMenuPresenterCallback == null) {
mPanelMenuPresenterCallback = new PanelMenuPresenterCallback();
}
MenuView menuView = st.isInListMode()
? st.getListMenuView(getContext(), mPanelMenuPresenterCallback)
: st.getIconMenuView(getContext(), mPanelMenuPresenterCallback);
st.shownPanelView = (View) menuView;
if (st.shownPanelView != null) {
// Use the menu View's default animations if it has any
final int defaultAnimations = menuView.getWindowAnimations();
if (defaultAnimations != 0) {
st.windowAnimations = defaultAnimations;
}
return true;
} else {
return false;
}
}PanelFeatureState.class 这个内部类中有很多的属性。其中有关于DocorView ,还有menu View -> showPanelView 是否跟新PhoneWindow这样的属性。貌似就可WindowsManger.LayoutParams 类似。将这个 menuView。WindowsAnimations给了 PanelFeatureState这个 windowAnimations .5.之后我们找到private void openPanel(final PanelFeatureState st, KeyEvent event) { // System.out.println("Open panel: isOpen=" + st.isOpen);
......
ViewParent shownPanelParent = st.shownPanelView.getParent();
if (shownPanelParent != null && shownPanelParent instanceof ViewGroup) {
((ViewGroup) shownPanelParent).removeView(st.shownPanelView);
}
st.decorView.addView(st.shownPanelView, lp);
......
st.isHandled = false;
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
width, WRAP_CONTENT,
st.x, st.y, WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG,
WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
| WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
st.decorView.mDefaultOpacity);
if (st.isCompact) {
lp.gravity = getOptionsPanelGravity();
sRotationWatcher.addWindow(this);
} else {
lp.gravity = st.gravity;
}
lp.windowAnimations = st.windowAnimations;
// Add begin by meitu.liujr for option menu theme
lp.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND;
lp.dimAmount = 0.6f;
// Add end
wm.addView(st.decorView, lp);
st.isOpen = true;
// Log.v(TAG, "Adding main menu to window manager.");
}将shownPanelView的父布局去掉,然后加入到docorView 中,然后将docorView 加入到PhoneWindow中。
0 0
- optionMenu如何弹出
- OptionMenu
- OptionMenu
- ActionBar中OptionMenu弹出菜单的位置和overflow右边距的调整
- optionMenu总结
- 如何解决Viewpager配合Fragment使用时相邻Fragment出现相同OptionMenu的问题?
- WinCE如何弹出菜单
- 如何生成弹出对话框
- 如何弹出等待对话框
- javascript如何弹出对话框
- 如何处理弹出窗口
- 弹出屏幕如何DEBUG
- 如何设置弹出窗口
- WPF如何弹出窗口
- service如何弹出dialog
- service如何弹出dialog
- 如何制作弹出窗口
- 如何弹出半透明UIViewController
- git 保存用户名和密码
- 第7课:p、hx、em、strong标签
- 数据结构--栈-编写一个算法输出n个布尔量的所有可能的组合
- 滴滴顺风车体验
- 《剑指offer》两个栈建立队列
- optionMenu如何弹出
- Linux&C语言文件操作学习笔记(一):基本概念与简单函数
- 运维角度浅谈MySQL数据库优化
- DOM基础01
- D - Apple Catching
- 如果让我来培养一个软件专业web端的大学生
- makefile用法(百度)
- 购物车
- 没关系,是爱情啊 经典台词