自定义布局的PopupWindow

最近写了一个PopupWindow的工具类,可以自定义PopupWindow中要显示的布局,布局的实现主要是利用了回调函数,这里不多说了  贴代码解释吧大笑

首先,上工具类代码

public class UtilPopupWindow {
    private PopupWindowCallback callback;

    public interface PopupWindowCallback {
        void setContentViewlayout(View contentView);
    }

    public void setPopupWindowCallback(PopupWindowCallback callback) {
        this.callback = callback;
    }

    public void setPopupWindow(Context context, int windowHeight, View contentView, View parentView,final int flag) {
        if(callback != null) {
            callback.setContentViewlayout(contentView);
        }
        PopupWindow window = new PopupWindow(contentView, ViewGroup.LayoutParams.MATCH_PARENT, windowHeight);
        window.setFocusable(true);
        window.setBackgroundDrawable(new ColorDrawable(0xffffff));
        window.setAnimationStyle(R.style.leafpopupwindow_animation);

        final Activity activity = (Activity) context;
        final WindowManager.LayoutParams windowlp = activity.getWindow().getAttributes();
        windowlp.alpha = 0.85f;
        activity.getWindow().setAttributes(windowlp);

        window.setOnDismissListener(new PopupWindow.OnDismissListener() {
            @Override
            public void onDismiss() {
                if (flag == 2) { //用于使第二层popupwindow退出时,背景色依旧半透明
                    windowlp.alpha = 0.85f;
                    activity.getWindow().setAttributes(windowlp);
                } else {
                    windowlp.alpha = 1f;
                    activity.getWindow().setAttributes(windowlp);
                }
            }
        });
        window.showAtLocation(parentView, Gravity.BOTTOM, 0, 0);
    }
}
这里的回调函数是为了在主activity中设置 要在popupwindow显示的布局,setPopupWindow函数中的参数依次是:contex; 要显示的popupwindow的窗体高度;popupwindow中要显示的布局;主activity的布局(这里是为了设置popupwindow在主activity的显示位置);最后这个标志位其作用是:由于我的代码中是先弹出一个popupwindow,在点击了里面的listview后,又进入一个子popupwindow。当两层popupwindow都退出前,为了让背景色一直保持半透明状态,所以加了这个标志。


主activity

//当然是先初始化popupWindow
popupWindow = new UtilPopupWindow();

//我再工具中没有写构造函数,这里调用默认的构造函数

WindowManager m = getWindowManager();
                Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用
                final int windowHeight = d.getHeight();
                //弹出框填充布局
                LinearLayout layout = (LinearLayout) getLayoutInflater().inflate(R.layout.item_instruction_interaction1, null);
                final LinearLayout layout2 = (LinearLayout) getLayoutInflater().inflate(R.layout.item_instruction_interaction2, null);

                popupWindow.setPopupWindowCallback(new UtilPopupWindow.PopupWindowCallback() {
                    @Override
                    public void setContentViewlayout(View contentView) {
                        setPopupWindowContent(contentView, windowHeight, layout2);
                    }
                });
                popupWindow.setPopupWindow(context, windowHeight * 2 / 3, layout, main_layout,1);

这里我封装了一个函数,主要就是设置布局,给第一层popupwindow布局设置数据,并且,当点击了其中的listview后,会出现第二个popupwindow

private void setPopupWindowContent(View contentView, final int windowHeight, final LinearLayout layout2) {
        RelativeLayout rl_mediencyclo_interaction_noData = (RelativeLayout)contentView.findViewById(R.id.rl_mediencyclo_interaction_noData);
        TextView drugText = (TextView) contentView.findViewById(R.id.tv_mediencyclo_interaction);
        drugText.setText("与“" + commonNameDrug.getCommonName() + "”相互作用的药品");
        TextView none = (TextView) contentView.findViewById(R.id.tv_mediencyclo_interaction_noData);
        ProgressBar progressBar = (ProgressBar) contentView.findViewById(R.id.mediencyclo_interaction_progressBar);
        ListView listView = (ListView) contentView.findViewById(R.id.instruction_listView);

        if (interactionList.size() > 0) {
            rl_mediencyclo_interaction_noData.setVisibility(View.GONE);
            none.setVisibility(View.GONE);
            progressBar.setVisibility(View.GONE);
            listView.setVisibility(View.VISIBLE);
            adapter = new MediEncycloInterActionAdapter(context, interactionList);
            listView.setAdapter(adapter);
        } else {
            rl_mediencyclo_interaction_noData.setVisibility(View.VISIBLE);
            progressBar.setVisibility(View.GONE);
            listView.setVisibility(View.GONE);
            none.setVisibility(View.VISIBLE);
        }
        listView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                final MediEncycloInteraction interaction = interactionList.get(position);
                popupWindow.setPopupWindowCallback(new UtilPopupWindow.PopupWindowCallback() {
                    @Override
                    public void setContentViewlayout(View layout2) {
                        setPopupWindowContent2(layout2, interaction);
                    }
                });
                popupWindow.setPopupWindow(context, windowHeight * 2 / 3, layout2, main_layout,2);
            }
        });
    }
下面就是第二个popupwindow的布局及数据设置

private void setPopupWindowContent2(View contentView, MediEncycloInteraction interaction) {
        TextView interaction_02 = (TextView) contentView.findViewById(R.id.tv_mediencyclo_interaction_02);
        TextView interaction_result_02 = (TextView) contentView.findViewById(R.id.tv_mediencyclo_interaction_result_02);

        if (interaction != null) {
            interaction_02.setText(interaction.getDrugName() + " VS " + interaction.getElements());
            interaction_result_02.setText(interaction.getDescription());
        }
    }



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值