最近写了一个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());
}
}