您的位置:首页 > 运维架构

自定义布局的PopupWindow

2015-11-23 15:38 387 查看
最近写了一个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());
        }
    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: