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

最近做了个小案例,关于弹出窗口的。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的调用
 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值