1、新建一个类BasePopupWindow,继承PopupWindow,重写其几个方法
public abstract class BasePopupWindow extends PopupWindow {
protected View mContentView;
public BasePopupWindow(){
super();
}
public BasePopupWindow(Context context, AttributeSet attrs, int defStyle){
super(context, attrs, defStyle);
}
public BasePopupWindow(Context context, AttributeSet attrs) {
super(context, attrs);
}
public BasePopupWindow(Context context) {
super(context);
}
public BasePopupWindow(int width, int height) {
super(width, height);
}
public BasePopupWindow(View contentView, int width, int height,
boolean focusable) {
super(contentView, width, height, focusable);
}
public BasePopupWindow(View contentView) {
super(contentView);
}
public BasePopupWindow(View contentView, int width, int height){
super(contentView, width, height, true);
mContentView = contentView;
setFocusable(true);
setOutsideTouchable(true);
// setAnimationStyle(R.style.Popup_Animation_Alpha);
setBackgroundDrawable(new ColorDrawable());
setTouchable(true);
initViews();
initEvents();
}
public abstract void initViews();
public abstract void initEvents();
public View findViewById(int id) {
return mContentView.findViewById(id);
}
}2、再创建一个类继承BasePopupWindow,把你所需求的下拉菜单布局xml定义好后,设置在该类里,并把可控件初始化、设置监听事件等。
下拉菜单布局 popup_windown_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:background="@drawable/main_navigation_background"
android:orientation="vertical"
android:baselineAligned="false"
android:padding="15dp" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants"
android:orientation="horizontal" >
<Button
android:id="@+id/menu1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@null"
android:drawableLeft="@drawable/android_my_jd_collects"
android:drawablePadding="5dp"
android:gravity="center"
android:text="我的收藏"
android:textColor="#ffffff" />
</LinearLayout>
<View
android:layout_width="fill_parent"
android:layout_height="2dp"
android:layout_marginBottom="5dp"
android:layout_marginTop="5dp"
android:background="#2f4f4f" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants"
android:orientation="horizontal" >
<Button
android:id="@+id/menu2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@null"
android:drawableLeft="@drawable/android_my_jd_orders"
android:drawablePadding="5dp"
android:gravity="center"
android:text="我的订单"
android:textColor="#ffffff" />
</LinearLayout>
<View
android:layout_width="fill_parent"
android:layout_height="2dp"
android:layout_marginBottom="5dp"
android:layout_marginTop="5dp"
android:background="#2f4f4f" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants"
android:orientation="horizontal" >
<Button
android:id="@+id/menu3"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@null"
android:drawableLeft="@drawable/android_my_jd_account_safe"
android:drawablePadding="5dp"
android:gravity="center"
android:text="修改密码"
android:textColor="#ffffff" />
</LinearLayout>
<View
android:layout_width="fill_parent"
android:layout_height="2dp"
android:layout_marginBottom="5dp"
android:layout_marginTop="5dp"
android:background="#2f4f4f" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants"
android:orientation="horizontal" >
<Button
android:id="@+id/menu4"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@null"
android:drawableLeft="@drawable/android_my_jd_messages"
android:drawablePadding="5dp"
android:gravity="center"
android:text="我的资料"
android:textColor="#ffffff" />
</LinearLayout>
</LinearLayout>MyMenuPopupWindow类:
public class MyMenuPopupWindow extends BasePopupWindow implements
OnClickListener {
/** popupmenu 中的各个item */
private Button menu1;
private Button menu2;
private Button menu3;
private Button menu4;
private onPopupMenuItemClickListener mOnPopupMenuItemClickListener;
/**
* 设置自定义的popupmenu布局
*/
public MyMenuPopupWindow(Context context, int width, int height) {
super(LayoutInflater.from(context).inflate(R.layout.popup_windown_menu,
null), width, height);
}
@Override
public void initViews() {
menu1 = (Button) findViewById(R.id.menu1);
menu2 = (Button) findViewById(R.id.menu2);
menu3 = (Button) findViewById(R.id.menu3);
menu4 = (Button) findViewById(R.id.menu4);
}
@Override
public void initEvents() {
menu1.setOnClickListener(this);
menu2.setOnClickListener(this);
menu3.setOnClickListener(this);
menu4.setOnClickListener(this);
}
@Override
public void init() {
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.menu1:
if (mOnPopupMenuItemClickListener != null) {
mOnPopupMenuItemClickListener.onMyFavoritesButtunClick();
}
break;
case R.id.menu2:
if (mOnPopupMenuItemClickListener != null) {
mOnPopupMenuItemClickListener.onMyOrderButtunClick();
}
break;
case R.id.menu3:
if (mOnPopupMenuItemClickListener != null) {
mOnPopupMenuItemClickListener.onMyresetPasswdButtunClick();
}
break;
case R.id.menu4:
if (mOnPopupMenuItemClickListener != null) {
mOnPopupMenuItemClickListener.onMyInfosButtunClick();
}
break;
}
dismiss();
}
public void setOnPopupMenuItemClickListener(
onPopupMenuItemClickListener listener) {
mOnPopupMenuItemClickListener = listener;
}
public interface onPopupMenuItemClickListener {
void onMyFavoritesButtunClick();
void onMyOrderButtunClick();
void onMyresetPasswdButtunClick();
void onMyInfosButtunClick();
}
}
getStatusBarHeight 是获取手机状态栏高度
<pre name="code" class="html">public class PopupActivity extends Activity implements onPopupMenuItemClickListener {
private MyMenuPopupWindow mPopupMenu = null;
private RelativeLayout top_layout = null;
private Button more_button;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
more_button = (Button) findViewById(R.id.more_button);
mPopupMenu = new MyMenuPopupWindow(this, 280, LayoutParams.WRAP_CONTENT);
top_layout = (RelativeLayout) findViewById(R.id.top_layout);
mPopupMenu.setOnPopupMenuItemClickListener(this);
more_button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int height = top_layout.getHeight() + CommonTools.getStatusBarHeight( PopupActivity.this);
int width = top_layout.getWidth();
mPopupMenu.showAtLocation(top_layout, Gravity.TOP, width, height);//把Menu设置在top_layout高度开始处,右边开始处
}
});
}
//-------自定义的菜单对应的按钮事件------------------------------------
@Override
public void onMyFavoritesButtunClick() {
startActivity(new Intent(this, SplashActivity.class));
}
@Override
public void onMyOrderButtunClick() {
Toast.makeText(getApplicationContext(), "我的订单", Toast.LENGTH_SHORT).show();
}
@Override
public void onMyresetPasswdButtunClick() {
Toast.makeText(getApplicationContext(), "修改密码", Toast.LENGTH_SHORT).show();
}
@Override
public void onMyInfosButtunClick() {
Toast.makeText(getApplicationContext(), "我的资料", Toast.LENGTH_SHORT).show();
}
}
本文介绍如何在Android中创建一个仿微信头部的下拉菜单。通过自定义BasePopupWindow类并继承PopupWindow,重写相关方法。下拉菜单的布局文件为popup_window_menu.xml,同时提供获取手机状态栏高度的方法。
1269

被折叠的 条评论
为什么被折叠?



