自定义布局的PopupWindow
2015-11-23 15:38
387 查看
最近写了一个PopupWindow的工具类,可以自定义PopupWindow中要显示的布局,布局的实现主要是利用了回调函数,这里不多说了 贴代码解释吧
首先,上工具类代码
主activity
这里我封装了一个函数,主要就是设置布局,给第一层popupwindow布局设置数据,并且,当点击了其中的listview后,会出现第二个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()); } }
相关文章推荐
- 怎样安装配置tomcat 8
- Mac 下使用EasyPR的方法,CMake,OpenCV
- linux设备驱动归纳总结(五):4.写个简单的LED驱动
- Android学习----Android架构
- 在CentOS 6.3/6.6 64bit上源码安装cmake 3.4.0
- GeoPandas官方中文文档--译著
- GeoPandas官方中文文档--译著
- Linux目录结构和常用命令
- nginx配置
- linux命令---cp 命令
- php+apache配置
- v4l2_open()浅析
- 编写Linux标准的PWM驱动
- HBase系统架构
- MVC,MVP 和 MVVM 的图示及mvp设计模式架构设计图
- linux block IO open的顺序图
- VMware安装RedHat Linux系统时出现该光盘无法被挂载错误怎么办?
- CSDN网站系统升级公告
- OpenGL中视口变换的矩阵求解
- shell中经常能看到的:>/dev/null 2>&1