最近做了个小案例,关于弹出窗口的。TAT 总感觉自己速度好慢啊~果然是不熟练!还是要多练!
首先我参考了网上的源码,发现居然有popupwindow这类神奇的东西,本来是想用对话框或者参考spinner源码(虽然现在对我而言还挺困难的)做的,果然我想得太复杂了~
首先是弄了个按钮,点击的话可以初始化popupwindow(设置了一个Listview配置进去)
popupWindow = new PopupWindow(listView, getScreenWidth(this)/4,getScreenHeight(this)/6);
API文档: PopupWindow(View contentView, int width, int height)
Create a new non focusable popup window which can display the contentView.
这个类的初始化涉及坐标,view,是否可点击。
小积累:获取屏幕宽高 (另一篇文章标题)
然后我复习了一下listview,它的适配器要重写四个方法的,new一个arraylist装上去就好了,一个适配器可以弄多个arraylist
套路代码:
private ListView listView; private ArrayList<String> datas;
private void initListView() {
listView = new ListView(this);
datas = new ArrayList<String>();
datas.add("111");
datas.add("222");
datas.add("333");
listView.setAdapter(new MyAdapter());
}
class MyAdapter extends BaseAdapter {
@Override //一共有多少数据需要显示
public int getCount() {
return datas.size();
}
@Override //返回position位置的指定对象
public Object getItem(int position) {
return datas.get(position);
}
@Override //返回position对应位置的id
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
/* View view;
if(convertView == null){
view = View.inflate(parent.getContext(), R.layout.item_number, null);
}else {
view = convertView;
}
*/
TextView tv_number = (TextView) view.findViewById(R.id.tv_number);
tv_number.setText(datas.get(position));
return view;//也可以return tv的。
}
}
popupwindow常用方法:
popupWindow.dismiss(); 弹出。
弹入的时候new它,然后show....()(这个方法可以设置它在那里show,是控制显示位置的)就好了,比如showasdropdown()
popupwindow.setOutsideTouchable(true);表示在外部区域点击的时候,自动隐藏
popupwindow.setFoucusable(true);与布局一起用,获取焦点点击事件,必须要有这个,否则就算你在下面设置了listview的onitemclicklisten也没用。
popupwindow.setBackgroundDrawable(new BitmapDrawable());是设置空的背景
-------------
取焦点:在item所在布局(根点)加上:
android:descendantFocusability="blocksDescendants" 这是设置“块”的可取焦点,假如listview的一行又有图像,文字,按钮,那么按钮就会更优先地获得焦点,为了使这一行都能获得焦点(功能可以不同),于是选择blocksDescendants。
listView.setDividerHeight(0);(设置分割线高度)
listView.setBackgroundResource(R.drawable.listview_background);
listView.setOnItemClickListener(this);(可点击事件)
用popuwindow同样可以模仿制作spinner的实现效果
1、写布局的小积累:
在relativelayout中,设置控件在右边:layout_alignparentright="true"
gravity(center_vertical是垂直居中)和layout_gravity是不同的
padding可以扩大点击范围(图片上看不到,但是点击范围(点击控件周围显示的那些小框框)真的大了),是内边距。
magin是外边距,用法是layout_magin
Padding 为内边框,指该控件内部内容,如文本/图片距离该控件的边距
Margin 为外边框,指该控件距离边父控件的边距
orientation是方向(一半linearlayout)
2、实现逻辑:
在main中的oncreate()里直接findViewById,相当于前面省略了一个当前引用对象main。也有点类似匿名了,可以直接find..。(R).setOnClickListener(this)。
new popupwindow,listview,adapter。然后设置点击按钮show popupwindow事件。然后得到listview的点击事件:
listview.setOnItemClickListener(this);
和按钮点击事件差不多,在下面加方法:
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
System.out.println("onItemClick: " + position);
ed.setText(datas.get(position));
popupWindow.dismiss();
}
在adapater的第四个方法中加上找到按钮控件匿名(在第四个方法的括号中要加上final,这是java基础相关)点击按钮删除某一行:把datas.get(position)换成datas.remove(position)
if(datats.size()==0)dismiss掉popupwindow
在这第四个方法里面find....前面要加上view,否则就不是第四个方法所属对象的调用,而是当前main的调用