您的位置:首页 > 移动开发 > Android开发

Android 自定义主菜单

2015-08-25 00:26 405 查看
本文介绍一个超简单的自定义主菜单,效果如下:



原理:其实就是对原生的Dialog的一个简单的封装。并加上显示和隐藏的动画效果。再给控件加上回调事件。

TestDialog.java

public class TestDialog implements OnClickListener {
	private Context mContext;
	private Dialog mDialog;
	private Display mDisplay;
	private TextView mTitle;
	private TextView mOk, mCancel;
	private LinearLayout mContent;
	private List<String> mItems = null;
	private List<OnCustomItemClickListener> mListeners = null;
	private List<Drawable> mDrawables = null;

	public TestDialog(Context context) {
		this.mContext = context;
		WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
		mDisplay = windowManager.getDefaultDisplay();
	}

	/**
	 * builder()创建
	 * 
	 * @return
	 */
	public TestDialog builder(int layout) {
		initView(layout);
		return this;
	}

	/**
	 * 初始化Dialog视图的方法
	 * 
	 * @param layout
	 */
	private void initView(int layout) {
		View view = LayoutInflater.from(mContext).inflate(layout, null);
		view.setMinimumWidth(mDisplay.getWidth());
		//
		mTitle = (TextView) view.findViewById(R.id.menu_title);
		mContent = (LinearLayout) view.findViewById(R.id.menu_content);
		mOk = (TextView) view.findViewById(R.id.menu_ok);
		mCancel = (TextView) view.findViewById(R.id.menu_cancel);
		mOk.setOnClickListener(this);
		mCancel.setOnClickListener(this);
		mDialog = new Dialog(mContext, R.style.DialogStyle);
		mDialog.setContentView(view);
		Window dialogWindow = mDialog.getWindow();
		dialogWindow.setGravity(Gravity.LEFT | Gravity.BOTTOM);
		WindowManager.LayoutParams lp = dialogWindow.getAttributes();
		lp.x = 0;
		lp.y = 0;
		dialogWindow.setAttributes(lp);
	}

	/**
	 * 
	 * @param 是否能取消
	 * @return
	 */
	public TestDialog setCancelable(boolean b) {
		if (mDialog != null) {
			mDialog.setCancelable(b);
		}
		return this;
	}

	/**
	 * 设置对话框标题
	 * 
	 * @param title
	 * @return
	 */
	public TestDialog setTitle(String title) {
		if (mDialog != null) {
			mTitle.setText(title);
			mTitle.setVisibility(View.VISIBLE);
		}
		return this;
	}

	/**
	 * 
	 * @param 点击Dialog以外的部分是否可以取消
	 * @return
	 */

	public TestDialog set(boolean b) {
		if (mDialog != null) {
			mDialog.setCanceledOnTouchOutside(b);
		}
		return this;
	}

	/**
	 * 取消
	 */
	public void dismiss() {
		mDialog.dismiss();
	}

	/**
	 * 用来装视图数据的集合
	 * 
	 * @param title
	 * @return
	 */
	public TestDialog addItem(String title, Drawable drawable, OnCustomItemClickListener clickListener) {
		if (mItems == null) {
			mItems = new ArrayList<String>();
		}
		if (mListeners == null) {
			mListeners = new ArrayList<TestDialog.OnCustomItemClickListener>();
		}
		if (mDrawables == null) {
			mDrawables = new ArrayList<Drawable>();
		}
		mItems.add(title);
		mListeners.add(clickListener);
		mDrawables.add(drawable);
		return this;
	}

	private void setItem() {
		if (mItems == null || mItems.size() <= 0) {
			return;
		}
		int count = mItems.size();
		for (int i = 0; i < count; i++) {
			final int index = i;
			TextView view = new TextView(mContext);
			view.setText("object" + 1);
			view.setCompoundDrawablesRelativeWithIntrinsicBounds(null, mDrawables.get(i), null, null);
			view.setOnClickListener(new OnClickListener() {

				@Override
				public void onClick(View v) {
					// TODO Auto-generated method stub
					mListeners.get(index).onClick(index);
				}
			});
			mContent.addView(view);
		}
	}

	public void show() {
		setItem();
		mDialog.show();
	}

	public interface OnCustomItemClickListener {
		public abstract void onClick(int v);
	}

	@Override
	public void onClick(View v) {
		if (v == mOk) {

		} else if (v == mCancel) {

		}
		mDialog.dismiss();

	}

}


用到的Teme:

<style name="DialogStyle" parent="@android:style/Theme.Dialog">

        <!-- 背景透明 -->
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowContentOverlay">@null</item>
        <!-- 浮于Activity之上 -->
        <item name="android:windowIsFloating">true</item>
        <!-- 边框 -->
        <item name="android:windowFrame">@null</item>
        <!-- Dialog以外的区域模糊效果 -->
        <item name="android:backgroundDimEnabled">true</item>
        <!-- 无标题 -->
        <item name="android:windowNoTitle">true</item>
        <!-- 半透明 -->
        <item name="android:windowIsTranslucent">true</item>
        <!-- Dialog进入及退出动画 -->
        <item name="android:windowAnimationStyle">@style/ActionSheetDialogAnimation</item>
    </style>

    <style name="ActionSheetDialogAnimation" parent="@android:style/Animation.Dialog">
        <item name="android:windowEnterAnimation">@anim/dialog_in</item>
        <item name="android:windowExitAnimation">@anim/dialog_out</item>
    </style>
动画文件:

dialog_in.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="200"
    android:fromYDelta="100%"
    android:toYDelta="0" />
dialog_out.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="200"
    android:fromYDelta="0"
    android:toYDelta="100%" />


用到的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/white"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/menu_title"
        android:layout_width="match_parent"
        android:layout_height="45dip"
        android:background="@drawable/menu_item_background"
        android:gravity="center"
        android:visibility="gone" />

    <LinearLayout
        android:id="@+id/menu_content"
        android:layout_width="match_parent"
        android:layout_height="150dip"
        android:gravity="center_vertical"
        android:orientation="horizontal" >
    </LinearLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="1px"
        android:background="@android:color/darker_gray" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="45dip"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/menu_ok"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@drawable/menu_item_background"
            android:gravity="center"
            android:text="@string/menu_ok" />

        <View
            android:layout_width="1px"
            android:layout_height="match_parent"
            android:background="@android:color/darker_gray" />

        <TextView
            android:id="@+id/menu_cancel"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@drawable/menu_item_background"
            android:gravity="center"
            android:text="@string/menu_cancel" />
    </LinearLayout>

</LinearLayout>


用到的背景
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@android:color/darker_gray" android:state_focused="true"></item>
    <item android:drawable="@android:color/darker_gray" android:state_pressed="true"></item>
    <item android:drawable="@android:color/white"></item>

</selector>


在Activity中使用:

findViewById(R.id.click).setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				TestDialog dialog = new TestDialog(MainActivity.this);
				dialog.builder(R.layout.menu);
				dialog.setCancelable(false);
				dialog.addItem("微博1", getResources().getDrawable(R.drawable.ic_weibo), new OnCustomItemClickListener() {

					@Override
					public void onClick(int v) {
						Toast.makeText(getBaseContext(), "1", 1).show();
					}
				});
				dialog.addItem("微博2", getResources().getDrawable(R.drawable.ic_weibo), new OnCustomItemClickListener() {

					@Override
					public void onClick(int v) {
						Toast.makeText(getBaseContext(), "3", 1).show();
					}
				});
				dialog.show();
			}
		});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: