栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

Android 使用PopupWindow实现弹出更多的菜单实例详解

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android 使用PopupWindow实现弹出更多的菜单实例详解

最近想要做一个弹出更多的菜单,而原生的弹出菜单却不是我们想要的效果,所以必然要自定义菜单咯。本人也是借鉴网上的资料进行封装的,感觉还蛮不错的。

原生的菜单如下图:

自定义之后的效果图:

是不是看到这里之后,对比可知,原生的效果不太理想,所以还是再自己定义吧!

1、PopupWindow可以说是一个浮动在Activity之上的容器,通常用来显示自定义的视图。弹出菜单的封装PopMenuMore

 
public class PopMenuMore { 
  
 private Context mContext; 
  
 private ArrayList mItemList; 
  
 private baseAdapter mAdapter; 
  
 private OnItemSelectedListener mListener; 
  
 private ImageView cornerIcon; 
  
 private ListView mListView; 
  
 private PopupWindow mPopupWindow; 
 public PopMenuMore(Context context) { 
 mContext = context; 
 mItemList = new ArrayList<>(); 
 View view = onCreateView(context); 
 view.setFocusableInTouchMode(true); 
 mAdapter = onCreateAdapter(context, mItemList); 
 cornerIcon = findCornerView(view); 
 mListView = findListView(view); 
 mListView.setAdapter(mAdapter); 
 mListView.setonItemClickListener(new AdapterView.onItemClickListener() { 
  @Override 
  public void onItemClick(AdapterView parent, View view, int position, long id) { 
  PopMenuMoreItem item = (PopMenuMoreItem) mAdapter.getItem(position); 
  if (mListener != null) { 
   mListener.selected(view, item, position); 
  } 
  mPopupWindow.dismiss(); 
  } 
 }); 
 view.setonKeyListener(new View.onKeyListener() { 
  @Override 
  public boolean onKey(View v, int keyCode, KeyEvent event) { 
  if (keyCode == KeyEvent.KEYCODE_MENU && mPopupWindow.isShowing()) { 
   mPopupWindow.dismiss(); 
   return true; 
  } 
  return false; 
  } 
 }); 
 mPopupWindow = new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true); 
 mPopupWindow.setBackgroundDrawable(new ColorDrawable(0x00000000)); 
 setBackgroundColor(Color.parseColor("#000000")); 
 setCorner(R.mipmap.triangle); 
 } 
  
 public void setBackgroundColor(int argb) { 
// int strokeWidth = 5; // 3dp 边框宽度 
 int roundRadius = 5; // 8dp 圆角半径 
// int strokeColor = Color.parseColor("#2E3135");//边框颜色 
// int fillColor = Color.parseColor("#DFDFE0");//内部填充颜色 
 GradientDrawable gd = new GradientDrawable();//创建drawable 
 gd.setColor(argb); 
 gd.setCornerRadius(roundRadius); 
// gd.setStroke(strokeWidth, strokeColor); 
 mListView.setBackgroundDrawable(gd); 
 } 
  
 public void setCorner(int resId) { 
 cornerIcon.setBackgroundResource(resId); 
 } 
 protected View onCreateView(Context context) { 
 return LayoutInflater.from(context).inflate(R.layout.layout_popmenu_more, null); 
 } 
 protected ImageView findCornerView(View view) { 
 return (ImageView) view.findViewById(R.id.corner_iv); 
 } 
 protected ListView findListView(View view) { 
 return (ListView) view.findViewById(R.id.menu_listview); 
 } 
  
 protected baseAdapter onCreateAdapter(Context context, ArrayList items) { 
 return new PopMenuMoreAdapter(context, items); 
 } 
  
 public void addItem(PopMenuMoreItem item) { 
 mItemList.add(item); 
 mAdapter.notifyDataSetChanged(); 
 } 
 public void addItems(List items) { 
 if (items != null) { 
  mItemList.clear(); 
 } 
 for (PopMenuMoreItem item : items) { 
  mItemList.add(item); 
 } 
 mAdapter.notifyDataSetChanged(); 
 } 
 
  
 public void showAsDropDown(View parent) { 
 mPopupWindow.showAsDropDown(parent); 
 } 
  
 public void dismiss() { 
 mPopupWindow.dismiss(); 
 } 
  
 public void setonItemSelectedListener(onItemSelectedListener listener) { 
 mListener = listener; 
 } 
  
 public boolean isShowing() { 
 return mPopupWindow.isShowing(); 
 } 
  
 public interface onItemSelectedListener { 
  
 void selected(View view, PopMenuMoreItem item, int position); 
 } 
} 

2、菜单中ListView的适配器:PopMenuMoreAdapter

 
public class PopMenuMoreAdapter extends baseAdapter { 
 private ArrayList items; 
 private Context context; 
 public PopMenuMoreAdapter(Context context, ArrayList items) { 
 this.context = context; 
 this.items = items; 
 } 
 @Override 
 public int getCount() { 
 return items.size(); 
 } 
 @Override 
 public PopMenuMoreItem getItem(int position) { 
 return items.get(position); 
 } 
 @Override 
 public long getItemId(int position) { 
 return position; 
 } 
 @Override 
 public View getView(int position, View view, ViewGroup parent) { 
 if (view == null) { 
  view = LayoutInflater.from(context).inflate(R.layout.item_popmenu_more, null); 
  ViewHolder holder = new ViewHolder(); 
  holder.icon = (ImageView) view.findViewById(R.id.menu_icon); 
  holder.text = (TextView) view.findViewById(R.id.menu_text); 
  view.setTag(holder); 
 } else if (view.getParent() != null) { 
  ((ViewGroup) view.getParent()).removeView(view); 
 } 
 ViewHolder holder = (ViewHolder) view.getTag(); 
 PopMenuMoreItem item = items.get(position); 
 if (item.getResId() == 0) { 
  holder.icon.setVisibility(View.GONE); 
 } 
 holder.text.setText(item.getText()); 
 return view; 
 } 
 private class ViewHolder { 
 ImageView icon; 
 TextView text; 
 } 
} 

3、菜单项中item:  PopMenuMoreItem

 
public class PopMenuMoreItem { 
 public int id; //标识 
 public int resId; //资源图标 
 public String text;//文字 
 public PopMenuMoreItem(int id, String text) { 
 this.id = id; 
 this.resId = 0; 
 this.text = text; 
 } 
 public PopMenuMoreItem(int id, int resId, String text) { 
 this.id = id; 
 this.resId = resId; 
 this.text = text; 
 } 
 public int getId() { 
 return id; 
 } 
 public void setId(int id) { 
 this.id = id; 
 } 
 public int getResId() { 
 return resId; 
 } 
 public void setResId(int resId) { 
 this.resId = resId; 
 } 
 public String getText() { 
 return text; 
 } 
 public void setText(String text) { 
 this.text = text; 
 } 
} 

4、宽度适配内容、不滚动的ListView:PopMenuMoreListView

 
public class PopMenuMoreListView extends ListView { 
 public PopMenuMoreListView(Context context) { 
 super(context); 
 } 
 public PopMenuMoreListView(Context context, AttributeSet attrs) { 
 super(context, attrs); 
 } 
 public PopMenuMoreListView(Context context, AttributeSet attrs, int defStyle) { 
 super(context, attrs, defStyle); 
 } 
 @Override 
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
 int width = 0; 
 for (int i = 0; i < getChildCount(); i++) { 
  View child = getChildAt(i); 
  child.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), heightMeasureSpec); 
  int w = child.getMeasuredWidth(); 
  if (w > width) width = w; 
 } 
 widthMeasureSpec = MeasureSpec.makeMeasureSpec(width + getPaddingLeft() + getPaddingRight(), MeasureSpec.EXACTLY); 
 super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
 } 
} 

5、item的布局:item_popmenu_more.xml

 
 
  
  
 

6、更多菜单的布局:layout_popmenu_more.xml

 
 
  
  
 

7、例子Activity: MainActivity

public class MainActivity extends Activity { 
 private static final int USER_SEARCH = 0; 
 private static final int USER_ADD = 1; 
 private PopMenuMore mMenu; 
 private TextView mTextView; 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.activity_main); 
 initMenu(); 
 mTextView = (TextView) findViewById(R.id.hello_tv); 
 mTextView.setonClickListener(new View.onClickListener() { 
  @Override 
  public void onClick(View view) { 
  mMenu.showAsDropDown(mTextView); 
  } 
 }); 
 } 
 private void initMenu() { 
 mMenu = new PopMenuMore(this); 
 // mMenu.setCorner(R.mipmap.demand_icon_location); 
 // mMenu.setBackgroundColor(Color.parseColor("#ff8800")); 
 ArrayList items = new ArrayList<>(); 
 items.add(new PopMenuMoreItem(USER_SEARCH, "搜索")); 
 items.add(new PopMenuMoreItem(USER_ADD, "添加")); 
 items.add(new PopMenuMoreItem(USER_SEARCH, "搜索")); 
 items.add(new PopMenuMoreItem(USER_ADD, "添加")); 
 items.add(new PopMenuMoreItem(USER_SEARCH, "搜索")); 
 items.add(new PopMenuMoreItem(USER_ADD, "添加")); 
  
 mMenu.addItems(items); 
 mMenu.setonItemSelectedListener(new PopMenuMore.onItemSelectedListener() { 
  @Override 
  public void selected(View view, PopMenuMoreItem item, int position) { 
  switch (item.id) { 
   case USER_SEARCH: 
//   startActivity(new Intent(this, UserSearchActivity.class)); 
   break; 
   case USER_ADD: 
//   startActivity(new Intent(getActivity(), UserAddActivity.class)); 
   break; 
  } 
  } 
 }); 
 } 
} 

8、例子布局:activity_main.xml

 
 
  

9、所需资源文件:

参考:

android使用PopupWindow实现页面点击顶部弹出下拉菜单

以上所述是小编给大家介绍的Android 使用PopupWindow实现弹出更多的菜单实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对考高分网网站的支持!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/159001.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号