接上一篇Android 滚动Tabhtml
Android的Menu键, 逐渐淡出历史舞台, 请×××看看Say Goodbye to the Menu button. Menu键消失不意味着Menu功能的消失, 偏偏相反Menu功能在Action Bar上面获得更广阔的发展. 效果以下:java
自定义Menu都是使用自定义的PopupWindow或者AlertDialog代替传统的Menu.android
这里我使用了ActionProvider+PopupWindow实现自定义Menu. 这也是Google官方推荐的方式.ide
在Activity中布局
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; }
menu的布局main.xml
动画
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/action_settings" android:orderInCategory="100" android:showAsAction="ifRoom" android:actionProviderClass="com.lichen.remind.actionbar.BlinkActionProvider" android:title="@string/action_settings"/> </menu>
自定义布局文件blink_action_provider.xml, 目标是加载到MenuItem的位置.this
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:id="@+id/menu_blink" android:layout_width="wrap_content" android:layout_height="wrap_content" android:contentDescription="@string/menu_blink"/> </RelativeLayout>
这里的布局只是一个图片. 能够给它添加Listener, 而后动态添加PopupWindow.spa
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(); } }); } }
这里的R.layout.fragment_about_me,R.id.about_me请参考上一篇的布局文件
3d
其实, 不只关注技术, 能够更多的关注设计理念. 如Menu的变化趋势.
真正好的设计, 我觉得是须要有对Android足够深刻的理解, 而不是仅仅PS几张图.