自定义控件:使用PopupWindow实现下拉框效果

来源:互联网 发布:网络犯罪调查2分集剧情 编辑:程序博客网 时间:2024/06/07 05:39

PopupWindow可以创建类似对话框风格的窗口,使用PopupWindow创建对话框风格的窗口只要如下两步即可:

1.调用PopupWindow的构造器创建PopupWindow对象。

2.调用PopupWindow的showAsDropDown(View view)将PopupWindow作为view组件的下拉组件显示出来;或调用PopupWindow的

showAtLocation()方法将PopupWindow在指定位置显示出来。

下拉框效果:

editText的右边放置一个小箭头的图片,点击图片,在editText的下方弹出一个popupWindow,并对popupWindow进行一些设置即得到想要的效果。


1.写布局文件activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent">    <EditText        android:id="@+id/et_input"        android:paddingRight="40dp"        android:layout_width="200dp"        android:layout_height="wrap_content"        android:text="@string/hello_world"        android:layout_centerHorizontal="true"        android:layout_marginTop="50dp" /><ImageView android:id="@+id/down_arrow"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_alignTop="@id/et_input"    android:background="@drawable/down_arrow"    android:layout_alignRight="@id/et_input"    android:layout_marginTop="5dp"    android:layout_marginRight="5dp"/></RelativeLayout>
2.实例化控件并准备数据

public class MainActivity extends Activity {private EditText et_input;private ImageView downArrow;/** * 装数据的集合 */private ArrayList<String> msgList;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);et_input = (EditText) findViewById(R.id.et_input);downArrow = (ImageView) findViewById(R.id.dowan_arrow);//准备数据msgList = new ArrayList<String>();for(int i=0;i<30;i++){msgList.add("aaaaaaaaaa"+i);}}}
3.设置向下箭头的点击事件并实例化popupWindow&TODO介绍
downArrow.setOnClickListener(this);//浮悬的窗体private PopupWindow  popupWindow;@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.dowan_arrow:if(popupWindow == null){popupWindow = new PopupWindow(this);//设置高和宽popupWindow.setWidth(et_input.getWidth());popupWindow.setHeight(200);//设置窗体的内容//TODO ListView 还没有初始化popupWindow.setContentView(listView);}popupWindow.showAsDropDown(et_input, 0, 0);break;}}

4.实例化ListView并设置适配器

onCreate方法中实例化ListView

//实例化ListViewlistView = new ListView(this);listView.setAdapter(new MyAdapter());

自定义适配器:

class MyAdapter extends BaseAdapter{@Overridepublic int getCount() {return msgList.size();}@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {View view;ViewHolder holder;if(convertView != null){view = convertView;holder = (ViewHolder) view.getTag();}else{view =  View.inflate(MainActivity.this, R.layout.list_popupwindow_item, null);holder = new ViewHolder();holder.iv_user = (ImageView) view.findViewById(R.id.iv_user);holder.tv_tilte = (TextView) view.findViewById(R.id.tv_tilte);holder.iv_delete = (ImageView) view.findViewById(R.id.iv_delete);view.setTag(holder);}holder.tv_tilte.setText(msgList.get(position));holder.iv_delete.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//1.把点击的条在列表中移除msgList.remove(position);//2.更新数据notifyDataSetChanged();}});return view;}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn 0;}}class ViewHolder{ImageView iv_user;TextView tv_tilte;ImageView iv_delete;}

每条布局文件代码:list_popupwindow_item.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="55dip"    android:gravity="center_vertical"    android:padding="15dip" >    <ImageView        android:id="@+id/iv_user"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:background="@drawable/user"        android:padding="5dp" />    <TextView        android:id="@+id/tv_tilte"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerHorizontal="true"        android:text="aaaaaaaaa1" />    <ImageView        android:id="@+id/iv_delete"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentRight="true"        android:background="@drawable/delete"        android:padding="5dp" /></RelativeLayout>
5.ListView在低版本2.3的适配并解决各个问题

设置输入框宽度为200dp

<EditText        android:id="@+id/et_input"        android:paddingRight="40dip"        android:layout_marginTop="20dip"        android:layout_centerHorizontal="true"        android:layout_width="200dip"        android:layout_height="wrap_content"        android:text="@string/hello_world" />
解决按下变白的问题:

listView = new ListView(this);listView.setBackgroundResource(R.drawable.listview_background);listView.setAdapter(new MyAdapter());
解决点击popupwindow外部,无法消掉问题
popupWindow.setOutsideTouchable(true);
设置选择某一条,并且显示在输入框中

listView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {<span style="white-space:pre"></span>et_input.setText(msgList.get(position));}});

注意需要设置popupwindow的焦点才起作用

popupWindow.setFocusable(true);

在setOnItemClickListener方法中消掉对话框

popupWindow.dismiss();

整体代码:

package com.xbmu.popupwindow;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.BaseAdapter;import android.widget.EditText;import android.widget.ImageView;import android.widget.ListView;import android.widget.PopupWindow;import android.widget.TextView;public class MainActivity extends Activity implements OnClickListener {private EditText et_input;private ImageView down_arrow;/** * 装数据的集合 */private List<String> mDatas;//悬浮的窗体private PopupWindow popupWindow;private ListView mListView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);et_input = (EditText) findViewById(R.id.et_input);down_arrow = (ImageView) findViewById(R.id.down_arrow);down_arrow.setOnClickListener(this);mDatas = new ArrayList<String>();//封装数据for (int i = 0; i < 50; i++) {mDatas.add("aaaaaaaaaaa"+i);}mListView = new ListView(this);mListView.setBackgroundResource(R.drawable.listview_background);mListView.setAdapter(new MyAdapter());mListView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {et_input.setText(mDatas.get(position));popupWindow.dismiss();}});}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.down_arrow:if(popupWindow == null){popupWindow = new PopupWindow(this);//设置宽和高popupWindow.setWidth(et_input.getWidth());popupWindow.setHeight(200);//设置窗体的内容popupWindow.setContentView(mListView);popupWindow.setOutsideTouchable(true);popupWindow.setFocusable(true);}popupWindow.showAsDropDown(et_input, 0, 0);break;}}private class MyAdapter extends BaseAdapter{@Overridepublic int getCount() {return mDatas.size();}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {View view;ViewHolder holder;if(convertView == null){view = View.inflate(MainActivity.this, R.layout.popupwindow_item, null);holder = new ViewHolder();holder.iv_user = (ImageView) view.findViewById(R.id.iv_user);holder.tv_msg = (TextView) view.findViewById(R.id.tv_msg);holder.iv_delete = (ImageView) view.findViewById(R.id.iv_delete);view.setTag(holder);}else{view  = convertView;holder = (ViewHolder) view.getTag();}holder.tv_msg.setText(mDatas.get(position));holder.iv_delete.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//1.把点击的条在列表中移除mDatas.remove(position);//2.更新数据notifyDataSetChanged();}});return view;}}class ViewHolder{ImageView iv_user;TextView tv_msg;ImageView iv_delete;}}

全部代码下载地址:

http://download.csdn.net/detail/btt2013/9350371








0 0
原创粉丝点击