Android 自定义主菜单
2015-08-25 00:26
405 查看
本文介绍一个超简单的自定义主菜单,效果如下:
原理:其实就是对原生的Dialog的一个简单的封装。并加上显示和隐藏的动画效果。再给控件加上回调事件。
TestDialog.java
用到的Teme:
dialog_in.xml
用到的布局文件:
用到的背景
在Activity中使用:
原理:其实就是对原生的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(); } });
相关文章推荐
- java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.AndroidCaptureC
- android ble 4.0实现自动配对
- 兼容 Android 4.4 透明状态栏与导航栏
- Android 依赖注入
- android:includeFontPadding的使用:清除TextView字体周边空白
- 推荐两个比较全的android在线源代码
- Android 的上下文菜单: Context Menu,registerForContextMenu(getListView())
- [Android][转]Android多线程下安全访问数据库
- Android第三夜
- Android开发异常
- [Android][转]在Android上实现Java和Js交互
- android中圆环的实现
- android入门(四) 调试工具DDMS的使用
- android之VOLD:staging目录作用与ASEC文件 -总结
- Android 与Java单元测试配置
- Android中View(视图)绘制不同状态背景图片原理深入分析以及StateListDrawable使用详解
- Android 高效加载大图片
- Android中的windowSoftInputMode属性详解
- Android Studio编译时间过长问题解决
- Android布局解析,图文(转)