最近做项目时,需要使用到PopupWindow,里面的格式必须是动态的。
所以,我把实现瀑布流的那个原理应用到了这里。看图吧。。
步骤:
1、首先在布局文件中划分成两列。linear01,linear02 ;
2、初始化PopupWindow
private void initPopupWindow(){
int popWidth = getWindowManager().getDefaultDisplay().getWidth() ; //取得设备宽度
View popView = LayoutInflater.from(XXActivity.this).inflate(R.layout.popup, null) ; //取得PopupWindow的布局文件
linear01 = (LinearLayout) popView.findViewById(R.id.Linear01) ; //第一列
linear02 = (LinearLayout) popView.findViewById(R.id.Linear02) ; //第二列
int y = 0 ; //行号
/**
* 根据信息量的多少来动态插入多少个TextView // i 为每个添加的TextView 设置标记
*/
for (int i = 0; i < list.size(); i++) {
addInfoToTextView(list.get(i) , i , y) ; //实例化TextView
y++ ;
if (y>=2) { //判断信息要显示在哪列中。
y = 0 ;
}
}
/**
* 自适应PopupWindow
*/
final PopupWindow popupWindow = new PopupWindow(popView,
popWidth, LayoutParams.WRAP_CONTENT, true);
popupWindow.setTouchable(true);
popupWindow.setTouchInterceptor(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
return false;
}
});
// 如果不设置PopupWindow的背景,无论是点击外部区域还是Back键都无法dismiss弹框
// 我觉得这里是API的一个bug
popupWindow.setBackgroundDrawable(new BitmapDrawable());
// 设置好参数之后再show
popupWindow.showAsDropDown(txtArea);
}
/**
* 把创建好的TextView添加到相应的列中。
* @param str 信息内容
* @param i 行
* @param j 列
*/
private void addInfoToTextView(String str,int i, int j){
//动态添加TextView
TextView tv = addTextView(str,i) ; //实例化TextView
//动态添加分隔线
View divideLine = addDivideLine() ;
//插入到相应的LinearLayout中
if (j == 0 ) {
linear01.addView(tv) ;
linear01.addView(divideLine);
}else if(j == 1){
linear02.addView(tv) ;
linear02.addView(divideLine);
}
}
//添加TextView,显示信息
private TextView addTextView(String str , int i){
final TextView tv = new TextView(XXActivity.this) ;
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT) ;
params.setMargins(0, 10, 0, 5);
tv.setLayoutParams(params) ;
if (i == 0) {
tv.setTextColor(Color.YELLOW) ; //第一项,颜色高亮显示
}else{
tv.setTextColor(Color.WHITE) ;
}
tv.setText(str) ;
tv.setGravity(Gravity.CENTER) ; // 文字居中显示
tv.setTextSize(24) ;
tv.setTag(i) ;
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("tv", tv.getText().toString()) ;
}
});
return tv ;
}
//添加分隔线
private View addDivideLine(){
View v = new View(XXActivity.this) ;
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, 1) ;
v.setLayoutParams(params) ;
v.setBackgroundResource(R.drawable.land);
return v ;
}
上面的这些,是建立在已知多少列的情况下实现的。等有时间,我会在更新一个动态插入列的实现方式。