• Android 自己定义主菜单


    本文介绍一个超简单的自己定义主菜单。效果例如以下:


    原理:事实上就是对原生的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();
    			}
    		});



  • 相关阅读:
    lua中的冒号和点
    NuGet使用简要说明
    C#浅谈类实体与DataTable执行效率
    win8 使用技巧
    Bitnami Redmine 中文附件名 报错修复
    Markdown 测试
    几种常用网页返回顶部代码
    文字超出隐藏并显示省略号
    手机正则写法
    安卓内存管理相关关键字
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6994401.html
Copyright © 2020-2023  润新知