Android 自定義Menu

接上一篇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幾張圖.

相關文章
相關標籤/搜索