Android 模拟QQ空间小加号+用popupWindow制作spinner

来源:互联网 发布:java工资待遇如何 编辑:程序博客网 时间:2024/05/16 11:00

最近做了个小案例,关于弹出窗口的。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);
和按钮点击事件差不多,在下面加方法:
@Overridepublic 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的调用
 

0 0
原创粉丝点击