android实战之弹框自定义布局

引言

app项目中,经常用的弹框,如果自定义弹框,用到的时候调用出来,那就美哉。

实现

1. 工具类

public class CommonPopupWindow extends PopupWindow {
    private PopupController controller;
    private WindowManager.LayoutParams params;
    @Override
    public int getWidth() {
        return controller.mPopupView.getMeasuredWidth();
    }

    @Override
    public int getHeight() {
        return controller.mPopupView.getMeasuredHeight();
    }
    public interface ViewInterface {
        void getChildView(View view, int layoutResId);
    }

    private CommonPopupWindow(Context context) {

        controller = new PopupController(context, this);
    }

    @Override
    public void dismiss() {
        super.dismiss();
        controller.setBackGroundLevel(1.0f);
    }

    @Override
    public void showAsDropDown(View anchor, int xoff, int yoff) {
        super.showAsDropDown(anchor, xoff, yoff);
    }

    public static class Builder {
        private final PopupController.PopupParams params;
        private ViewInterface listener;

        public Builder(Context context) {
            params = new PopupController.PopupParams(context);
        }

        public Builder setView(int layoutResId) {
            params.mView = null;
            params.layoutResId = layoutResId;
            return this;
        }

        public Builder setView(View view) {
            params.mView = view;
            params.layoutResId = 0;
            return this;
        }

        /**
         * 设置子View
         *
         * @param listener ViewInterface
         * @return Builder
         */
        public Builder setViewOnclickListener(ViewInterface listener) {
            this.listener = listener;
            return this;
        }
        public Builder setWidthAndHeight(int width, int height) {
            params.mWidth = width;
            params.mHeight = height;
            return this;
        }

        /**
         * 设置背景灰色程度
         *
         * @param level 0.0f-1.0f
         * @return Builder
         */
        public Builder setBackGroundLevel(float level) {
            params.isShowBg = true;
            params.bg_level = level;
            return this;
        }

        /**
         * 是否可点击Outside消失
         *
         * @param touchable 是否可点击
         * @return Builder
         */
        public Builder setOutsideTouchable(boolean touchable) {
            params.isTouchable = touchable;
            return this;
        }

        /**
         * 设置动画
         *
         * @return Builder
         */
        public Builder setAnimationStyle(int animationStyle) {
            params.isShowAnim = true;
            params.animationStyle = animationStyle;
            return this;
        }

        public CommonPopupWindow create() {
            final CommonPopupWindow popupWindow = new CommonPopupWindow(params.mContext);
            params.apply(popupWindow.controller);
            if (listener != null && params.layoutResId != 0) {
                listener.getChildView(popupWindow.controller.mPopupView, params.layoutResId);
            }
            //测量View的宽高
            int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
            int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
            popupWindow.controller.mPopupView.measure(w, h);
            return popupWindow;
        }

    }

}

2. 使用方式

 popupWindows = new CommonPopupWindow.Builder(getContext())
                        .setView(R.layout.popup_good_tree)
                        .setWidthAndHeight(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT)
                        .setViewOnclickListener(new CommonPopupWindow.ViewInterface() {
                            @Override
                            public void getChildView(View view, int layoutResId) {
                                Log.e("TAG1231", "getChildView position: ");
                               ................
                            }
                        })
                        .setOutsideTouchable(true)
                        .create();

欢迎点赞收藏转发。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Spinner是一个下拉列表控件,用于从一组选项中选择一个选项。Spinner默认使用系统提供的下拉列表布局,但是你可以自定义Spinner的布局以适应你的应用程序的需求。 要自定义Spinner的布局,需要创建一个自定义布局文件,并在代码中指定它。以下是一个简单的示例。 首先,创建一个自定义布局文件。在res/layout目录下创建一个布局文件,例如spinner_item.xml。 ```xml <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/text1" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="16sp" android:textColor="#000000" android:padding="10dp"/> ``` 这个布局文件只包含了一个TextView,它将显示Spinner中的选项。 接下来,在代码中指定这个布局文件。找到Spinner控件的实例,然后使用setDropDownViewResource()方法将自定义布局文件设置为Spinner的下拉列表布局。 ```java Spinner spinner = (Spinner) findViewById(R.id.spinner); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.planets_array, R.layout.spinner_item); adapter.setDropDownViewResource(R.layout.spinner_item); spinner.setAdapter(adapter); ``` 在这个示例中,我们使用了预定义的数组R.array.planets_array作为Spinner的选项,并将自定义布局文件R.layout.spinner_item设置为下拉列表布局。 最后,你需要在布局文件中设置Spinner的样式和其他属性,以使它看起来是你想要的样子。你可以使用android:background设置Spinner的背景色,使用android:padding设置内边距等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值