设为首页 加入收藏

TOP

Android 自定义Menu
2014-11-24 03:20:02 来源: 作者: 【 】 浏览:0
Tags:Android 定义 Menu

Android的Menu键, 逐渐淡出历史舞台, 请翻墙看看Say Goodbye to the Menu button. Menu键消失不意味着Menu功能的消失, 恰恰相反Menu功能在Action Bar上面得到更广阔的发展. 效果如下:



自定义Menu都是使用自定义的PopupWindow或者AlertDialog代替传统的Menu.


这里我使用了ActionProvider+PopupWindow实现自定义Menu. 这也是Google官方推荐的方式.


--------------------------------------------------------------------------------


在Activity中


@Override


public boolean onCreateOptionsMenu(Menu menu) {


getMenuInflater().inflate(R.menu.main, menu);


return true;


}



menu的布局main.xml




android:id="@+id/action_settings"


android:orderInCategory="100"


android:showAsAction="ifRoom"


android:actionProviderClass="com.lichen.remind.actionbar.BlinkActionProvider"


android:title="@string/action_settings"/>




--------------------------------------------------------------------------------


自定义布局文件blink_action_provider.xml, 目标是加载到MenuItem的位置.


< xml version="1.0" encoding="utf-8" >



android:layout_width="match_parent"


android:layout_height="match_parent" >



android:layout_width="wrap_content"


android:layout_height="wrap_content"


android:contentDescription="@string/menu_blink"/>




这里的布局只是一个图片. 可以给它添加Listener, 然后动态添加PopupWindow.


android:actionProviderClass="com.lichen.remind.actionbar.BlinkActionProvider", 需要继承ActionProvider, 实现其onCreateActionView().


public class BlinkActionProvider extends ActionProvider implements OnClickListener {


private Context mContext;


private LayoutInflater mLayoutInflater;


private PopupWindow mPopWindow;


// 注意构造,需要super(context);


public BlinkActionProvider(Context context) {


super(context);


mContext = context;


}


@Override


@Deprecated


public View onCreateActionView() {


mLayoutInflater = LayoutInflater.from(mContext);


View rootView = mLayoutInflater.inflate(R.layout.blink_action_provider,


null);


ImageView menuBlink = (ImageView) rootView


.findViewById(R.id.menu_blink);


menuBlink.setBackgroundResource(R.drawable.blink_menu);


menuBlink.setOnClickListener(this);


return rootView;


}


@Override


public void onClick(View view) {


/** 自定义PopupWindow */


ViewGroup menuView = (ViewGroup) mLayoutInflater.inflate(


R.layout.fragment_about_me, null, true);


mPopWindow = new PopupWindow(menuView, LayoutParams.WRAP_CONTENT,


LayoutParams.WRAP_CONTENT, true);


// 设置背景透明色


mPopWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));


/**设置背景图


mPopWindow.setBackgroundDrawable(mContext.getResources().getDrawable(


R.drawable.balloon));*/


mPopWindow.setOutsideTouchable(true);// 设置触摸外面时消失


mPopWindow.setAnimationStyle(android.R.style.Animation_Dialog);// 设置动画效果


mPopWindow.showAsDropDown(view);// 显示位置在锚点view的左边底部


/** 点击TextView */


TextView tv = (TextView) menuView.findViewById(R.id.about_me);


tv.setOnClickListener(new View.OnClickListener() {


public void onClick(View v) {


Toast.makeText(mContext, "点击了BlinkMenu", Toast.LENGTH_SHORT)


.show();


mPopWindow.dismiss();


}


});


}


}


--------------------------------------------------------------------------------


其实, 不仅关注技术, 可以更多的关注设计理念. 如Menu的变化趋势.



真正好的设计, 我以为是需要有对Android足够深入的理解, 而不是仅仅PS几张图。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android 屏幕截图并用WindowManag.. 下一篇Android 用自定义PopupWindow实现..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C语言中如何将结构体 (2025-12-24 22:20:09)
·纯C语言结构体成员变 (2025-12-24 22:20:06)
·C语言中,指针函数和 (2025-12-24 22:20:03)
·哈希表 - 菜鸟教程 (2025-12-24 20:18:55)
·MySQL存储引擎InnoDB (2025-12-24 20:18:53)