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;
@Override
protected 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;
@Override
public 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
//实例化ListView
listView = new ListView(this);
listView.setAdapter(new MyAdapter());
自定义适配器:
class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
return msgList.size();
}
@Override
public 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() {
@Override
public void onClick(View v) {
//1.把点击的条在列表中移除
msgList.remove(position);
//2.更新数据
notifyDataSetChanged();
}
});
return view;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 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() {
@Override
public 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;
@Override
protected 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() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
et_input.setText(mDatas.get(position));
popupWindow.dismiss();
}
});
}
@Override
public 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{
@Override
public int getCount() {
return mDatas.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public 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() {
@Override
public 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