弹出窗是Android中非常重要的组件,它可以给用户予以信息提示、选择,增强用户交互体验。

XUIPopup

包括简单的自定义布局的XUIPopup以及内嵌ListView的XUIListPopup和XUISimplePopup。可定义向上弹出和向下弹出,并且弹出的指示箭头是自适应的。

XUIPopup

  • 演示效果

PopupWindow - 图1

  • 使用案例
  1. mNormalPopup = new XUIPopup(getContext());
  2. TextView textView = new TextView(getContext());
  3. textView.setLayoutParams(mNormalPopup.generateLayoutParam(
  4. DensityUtils.dp2px(getContext(), 250),
  5. WRAP_CONTENT
  6. ));
  7. textView.setLineSpacing(DensityUtils.dp2px(4), 1.0f);
  8. int padding = DensityUtils.dp2px(20);
  9. textView.setPadding(padding, padding, padding, padding);
  10. textView.setText("Popup 可以设置其位置以及显示和隐藏的动画");
  11. textView.setTextColor(ContextCompat.getColor(getContext(), R.color.xui_config_color_sub_title_common_explain_text));
  12. mNormalPopup.setContentView(textView);
  13. mNormalPopup.setOnDismissListener(new PopupWindow.OnDismissListener() {
  14. @Override
  15. public void onDismiss() {
  16. mBtnCommonPopup.setText("显示普通浮层");
  17. }
  18. });
  19. mNormalPopup.setAnimStyle(XUIPopup.ANIM_GROW_FROM_CENTER);
  20. mNormalPopup.setPreferredDirection(XUIPopup.DIRECTION_TOP);
  21. mNormalPopup.show(v);
  • 常用方法

1.设置自定义布局:setContentView(View root)

2.设置弹窗弹出的动画:setAnimStyle(int animStyle)

3.设置消失的监听:setOnDismissListener(PopupWindow.OnDismissListener listener)

4.设置弹出的方向:setPreferredDirection(int preferredDirection)

XUIListPopup

  • 演示效果

PopupWindow - 图2

  • 使用案例
  1. String[] listItems = new String[]{
  2. "Item 1",
  3. "Item 2",
  4. "Item 3",
  5. "Item 4",
  6. "Item 5",
  7. };
  8. XUISimpleAdapter adapter = XUISimpleAdapter.create(getContext(), listItems);
  9. mListPopup = new XUIListPopup(getContext(), adapter);
  10. mListPopup.create(DensityUtils.dp2px(200), DensityUtils.dp2px(150), new AdapterView.OnItemClickListener() {
  11. @Override
  12. public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
  13. ToastUtils.toast("Item " + (i + 1));
  14. mListPopup.dismiss();
  15. }
  16. });
  17. mListPopup.setOnDismissListener(new PopupWindow.OnDismissListener() {
  18. @Override
  19. public void onDismiss() {
  20. mBtnListPopup.setText("显示列表浮层");
  21. }
  22. });
  23. mListPopup.setAnimStyle(XUIPopup.ANIM_GROW_FROM_CENTER);
  24. mListPopup.setPreferredDirection(XUIPopup.DIRECTION_TOP);
  25. mListPopup.show(v);
  • 常用方法

1.创建弹窗:

  1. T create(int width, int maxHeight, AdapterView.OnItemClickListener onItemClickListener)
  2. T create(int width, int maxHeight)
  3. T create(int width)

2.设置是否有分割线:T setHasDivider(boolean hasDivider)

3.设置分割线的资源:T setDivider(Drawable divider)

4.设置分割线的高度:T setDividerHeight(int dividerHeight)

XUISimplePopup

  • 演示效果

PopupWindow - 图3

  • 使用案例
  1. mMenuPopup = new XUISimplePopup(getContext(), DemoDataProvider.menuItems)
  2. .create(new XUISimplePopup.OnPopupItemClickListener() {
  3. @Override
  4. public void onItemClick(XUISimpleAdapter adapter, AdapterItem item, int position) {
  5. ToastUtils.toast(item.getTitle().toString());
  6. }
  7. });
  8. mMenuPopup.showDown(v);
  • 常用方法

1.设置条目点击监听:T setOnPopupItemClickListener(final OnPopupItemClickListener onItemClickListener)

2.向下显示:showDown(View v)

3.向上显示:showUp(View v)

EasyPopup

对系统的PopupWindow进行的简单代理封装,方便PopupWindow的自定义和操作,支持上、下、左、右4种弹出位置。自定义的PopupWindow可继承BaseCustomPopup轻松实现。

  • 使用案例
  1. mCirclePop = new EasyPopup(getContext())
  2. .setContentView(R.layout.layout_friend_circle_comment)
  3. .setFocusAndOutsideEnable(true)
  4. .createPopup();
  5. TextView tvZan = mCirclePop.getView(R.id.tv_zan);
  6. TextView tvComment = mCirclePop.getView(R.id.tv_comment);
  7. tvZan.setOnClickListener(new View.OnClickListener() {
  8. @Override
  9. public void onClick(View v) {
  10. ToastUtils.toast("点赞");
  11. mCirclePop.dismiss();
  12. }
  13. });
  14. tvComment.setOnClickListener(new View.OnClickListener() {
  15. @Override
  16. public void onClick(View v) {
  17. ToastUtils.toast("评论");
  18. mCirclePop.dismiss();
  19. }
  20. });
  21. mCirclePop.showAtAnchorView(mBtnCircleComment, VerticalGravity.CENTER, HorizontalGravity.LEFT, 0, 0);
  • 常用方法

1.设置自定义布局内容

  1. T setContentView(View contentView);
  2. T setContentView(int layoutId);
  3. T setContentView(View contentView, int width, int height)

2.设置宽高

  1. T setWidth(int width);
  2. T setHeight(int height);

3.设置显示的对齐方式

  1. T setVerticalGravity(@VerticalGravity int verticalGravity);
  2. T setHorizontalGravity(@VerticalGravity int horizontalGravity);

4.设置动画的样式

  1. T setAnimationStyle(@StyleRes int animationStyle);

5.设置是否可以点击PopupWindow之外的地方dismiss

  1. T setFocusAndOutsideEnable(boolean focusAndOutsideEnable)

6.设置监听

  1. T setOnDismissListener(PopupWindow.OnDismissListener listener)
  2. T setOnAttachedWindowListener(OnAttachedWindowListener listener)

7.弹窗显示

(1)相对anchor view显示:

  1. void showAtAnchorView(@NonNull View anchor, @VerticalGravity final int vertGravity, @HorizontalGravity int horizGravity, int x, int y);

(2)PopupWindow自带的显示方法:

  1. void showAsDropDown(View anchor, int offsetX, int offsetY);

ViewTooltip

控件提示弹出窗,可自定义弹出的位置,持续时间以及样式。

  • 演示效果

PopupWindow - 图4

  • 使用案例
  1. ViewTooltip
  2. .on(mEditText)
  3. .color(Color.BLACK)
  4. .position(ViewTooltip.Position.LEFT)
  5. .text("Some tooltip with long text")
  6. .clickToHide(true)
  7. .autoHide(false, 0)
  8. .animation(new ViewTooltip.FadeTooltipAnimation(500))
  9. .onDisplay(new ViewTooltip.ListenerDisplay() {
  10. @Override
  11. public void onDisplay(View view) {
  12. ToastUtils.toast("onDisplay");
  13. }
  14. })
  15. .onHide(new ViewTooltip.ListenerHide() {
  16. @Override
  17. public void onHide(View view) {
  18. ToastUtils.toast("onHide");
  19. }
  20. })
  21. .show();
  • 常用方法

1.创建并设置提示控件依附的View:ViewTooltip on(final View view)

2.设置提示显示的相对位置:position(Position position)

3.设置自定义提示布局:customView(View customView)

4.设置提示持续的时间:duration(long duration)

5.设置提示框的背景颜色:color(int color)

6.设置显示和隐藏的监听:

  1. onDisplay(ListenerDisplay listener);
  2. onHide(ListenerHide listener);

7.设置间隔的距离:padding(int left, int top, int right, int bottom)

8.设置显示和隐藏的动画:animation(TooltipAnimation tooltipAnimation)

9.设置提示的文字:text(String text)

10.设置圆角的角度:corner(int corner)

11.设置提示文字的颜色:textColor(int textColor)

12.设置提示文字的字体大小:textSize(int unit, float textSize)

13.设置是否点击隐藏:clickToHide(boolean clickToHide)

CookieBar

顶部和底部信息消息显示条, 类似Snackbar,支持自定义布局。

  • 演示效果

PopupWindow - 图5

  • 使用案例
  1. CookieBar.builder(getActivity())
  2. .setTitle(R.string.cookie_title)
  3. .setIcon(R.mipmap.ic_launcher)
  4. .setMessage(R.string.cookie_message)
  5. .setLayoutGravity(Gravity.BOTTOM)
  6. .setAction(R.string.cookie_action, new View.OnClickListener() {
  7. @Override
  8. public void onClick(View view) {
  9. ToastUtils.toast("点击消失!");
  10. }
  11. })
  12. .show();
  13. CookieBar.builder(getActivity())
  14. .setTitle(R.string.cookie_title)
  15. .setMessage(R.string.cookie_message)
  16. .setDuration(3000)
  17. .setBackgroundColor(R.color.colorPrimary)
  18. .setActionColor(android.R.color.white)
  19. .setTitleColor(android.R.color.white)
  20. .setAction(R.string.cookie_action, new View.OnClickListener() {
  21. @Override
  22. public void onClick(View view) {
  23. ToastUtils.toast("点击消失!");
  24. }
  25. })
  26. .show();

XToast

自定义Toast样式

  • 使用案例
  1. XToast.error(getContext(), R.string.error_message).show();
  2. XToast.success(getContext(), R.string.success_message).show();
  3. XToast.info(getContext(), R.string.info_message).show();
  4. XToast.warning(getContext(), R.string.warning_message).show();
  5. XToast.normal(getContext(), R.string.normal_message_without_icon).show();