您的位置:首页 > 运维架构

PopUpWindow

2016-12-25 21:33 120 查看
PopupWindow是Android上自定义弹出窗口,使用起来很方便。

PopUpWindow与AlertDialog最关键的区别是AlertDialog不能指定显示位置,只能默认显示在屏幕最中间(当然也可以通过设置WindowManager参数来改变位置)。

而PopupWindow是可以指定显示位置的,随便哪个位置都可以,更加灵活。

MainActivity代码:

import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.SimpleAdapter;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;

//popuwindow下拉列表,属于组合式控件
public class MainActivity extends AppCompatActivity {

@Bind(R.id.supplier_list_product_tv)
TextView mProductTv; // 可以修改名称
@Bind(R.id.supplier_list_product)
LinearLayout mProduct; // 可以修改名称
@Bind(R.id.supplier_list_sort_tv)
TextView mSortTv;
@Bind(R.id.supplier_list_sort)
LinearLayout mSort; // 可以修改名称
@Bind(R.id.supplier_list_activity_tv)
TextView mActivityTv;
@Bind(R.id.supplier_list_activity)
LinearLayout mActivity; // 可以修改名称
@Bind(R.id.supplier_list_lv)
ListView mSupplierListLv;
//三个Popuwindow所需要的数据集合
private ArrayList<Map<String, String>> menuData1;
//三个Popuwindow所需要的数据集合
private ArrayList<Map<String, String>> menuData2;
//三个Popuwindow所需要的数据集合
private ArrayList<Map<String, String>> menuData3;
//popupwindow所用的ListView
private ListView listView;
private PopupWindow popupWindow;

//设置三个popupwindow所需要的适配器
private SimpleAdapter mMenuAdapter1;
private SimpleAdapter mMenuAdapter2;
private SimpleAdapter mMenuAdapter3;

//设置的一个标记,方便对点击不同的LinearLayout做对应的操作
private int menuIndex = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//ButterKnife的初始化
ButterKnife.bind(this);
//初始化数据Popuwindow显示的数据
initData();
initMenu();
}

//初始化Popuwindow
private void initMenu() {
//把包裹的ListView的布局XML文件转换为XMl对象
View popView = LayoutInflater.from(this).inflate(R.layout.popwin_supplier_list, null);
//获取ListView对象
listView = (ListView) popView.findViewById(R.id.popwin_supplier_list_lv);
//创建popupwindow对象,参数1,popupwindow要显示的布局,参数2,3:定义popupwindow所占用的长宽
popupWindow = new PopupWindow(popView, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
//设置popupwindow外部可以点击
popupWindow.setOutsideTouchable(true);
//使popupwindow里填充的ListView拥有焦点
popupWindow.setFocusable(true);
//如果想要让popupwindow具有一些操作,比如动画效果之类的,必须给popupwindow设置背景
popupWindow.setBackgroundDrawable(new ColorDrawable());
//设置popupwindow的动画效果
popupWindow.setAnimationStyle(R.style.popwin_anim_style);
//设置popupwindow的监听事件
popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
//设置TextView的颜色
mProductTv.setTextColor(Color.parseColor("#5a5959"))
4000
;
mSortTv.setTextColor(Color.parseColor("#5a5959"));
mActivityTv.setTextColor(Color.parseColor("#5a5959"));
}
});
//点击ListView以外的区域使popupwindow消失,(实际就是让ListView下面的LinearLayout设置点击监听事件
LinearLayout list_bottom = (LinearLayout) popView.findViewById(R.id.popwin_supplier_list_bottom);
list_bottom.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//当LinearLayout被点击时,则popupwindow消失
popupWindow.dismiss();
}
});

//点击popuwindow以外区域时,使popuwindow消失.在这里得到了ListView下面的LinearLayout,设置监听事件
/*SimpleAdapter 简单数据适配器:正好有一组数据,是Map集合放到ArrayList集合,就可以使用这个适配器了,不是太常用,设置数据太麻烦.
context:上下文 data:设置所有条目的数据,一个ArrayList大集合(包含所有条目信息),里面又有一个map集合(通过map来设置一个条目的数据)
resource:引用布局资源(可以引用复杂的布局.xml文件,区别于ArrayAdapter)
from:String数组,装map条目内容的键 to:int数组,装控件id 二者具有映射关系,代表对应的内容放到对应的位置*//*
ArrayList<Map<String,Object>> data=new ArrayList<Map<String,Object>>();
//注意:一个map,代表一条item的数据.
Map<String,Object> map=new HashMap<String, Object>();
ListView对象.setAdapter(new SimpleAdapter(context, data, resource, from, to));*/
//创建SimpleAdapter,一个listView安卓原生封装的适配器

mMenuAdapter1 = new SimpleAdapter(this, menuData1, R.layout.item_listview_popwin, new String[]{"name"}, new int[]{R.id.listview_popwind_tv});
mMenuAdapter2 = new SimpleAdapter(this, menuData2, R.layout.item_listview_popwin, new String[]{"name"}, new int[]{R.id.listview_popwind_tv});
mMenuAdapter3 = new SimpleAdapter(this, menuData3, R.layout.item_listview_popwin, new String[]{"name"}, new int[]{R.id.listview_popwind_tv});

//设置popupwindow里ListView的item的点击事件,当点击item时,把item数据显示到最上方
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
//首先让popupwindow消失
popupWindow.dismiss();
//设置一个标识,以方便做对应LinearLayout的点击事件
switch (menuIndex){
case 0:
//获取点击对应条目的文本数据
String currentProduct = menuData1.get(i).get("name");
//把文本设置到原始布局里的文本
mProductTv.setText(currentProduct);
break;
case 1:
//获取点击对应条目的文本数据
String currentSort = menuData2.get(i).get("name");
//把文本设置到原始布局里的文本
mSortTv.setText(currentSort);
break;
case 2:
//获取点击对应条目的文本数据
String currentActivity = menuData3.get(i).get("name");
//把文本设置到原始布局里的文本
mActivityTv.setText(currentActivity);
break;
default:
break;
}
}
});
}

//初始化数据,popuwindow所需,一共有3个popuwindow,所以做3个盒子数据,这里都是假数据,真实数据需要在网上获取
private void initData() {
//创建一个存放popuwindow加载数据的大盒子,Map集合(键,值)
menuData1 = new ArrayList<>();
//存放String字符串数组
String[] menuStr1 = new String[]{"全部", "粮油", "衣服", "图书", "电子产品", "酒水饮料", "水果"};
//创建一个小盒子,存放编号和值
Map<String,String> map1;
for (int i = 0; i < menuStr1.length; i++) {
map1 = new HashMap<String,String>();
map1.put("name",menuStr1[i]);
menuData1.add(map1);
}

menuData2 = new ArrayList<>();
//存放String字符串数组
String[] menuStr2 = new String[]{"综合排序","配送费最低"};
//创建一个小盒子,存放编号和值
Map<String,String> map2;
for (int i = 0; i < menuStr2.length; i++) {
map2 = new HashMap<String,String>();
map2.put("name",menuStr2[i]);
menuData2.add(map2);
}

menuData3 = new ArrayList<>();
//存放String字符串数组
String[] menuStr3 = new String[]{"优惠活动","特价活动","免配送费","可在线支付"};
//创建一个小盒子,存放编号和值
Map<String,String> map3;
for (int i = 0; i < menuStr3.length; i++) {
map3 = new HashMap<String,String>();
map3.put("name",menuStr3[i]);
menuData3.add(map3);
}
}

//三个Popuwindow所依附的LinearLayout,设置点击事件
@OnClick({R.id.supplier_list_product,R.id.supplier_list_sort,R.id.supplier_list_activity})
public void onClick(View view){
switch (view.getId()){
//设置第一个Popuwindow所执行的点击后的逻辑
case R.id.supplier_list_product:
//设置其TextView被点击时为绿色
mProductTv.setTextColor(Color.parseColor("#893c69"));
//设置Popuwindow里的ListView适配器
listView.setAdapter(mMenuAdapter1);
//让popupwindow显示出来.参数1:View对象,决定了在哪个控件下显示,参数2,3:决定了popupwindow坐标x轴和y轴
popupWindow.showAsDropDown(mProduct,0,2);
menuIndex = 0;
break;
case R.id.supplier_list_sort:
mSortTv.setTextColor(Color.parseColor("#893c69"));
listView.setAdapter(mMenuAdapter2);
popupWindow.showAsDropDown(mSort,0,2);
menuIndex = 1;
break;
case R.id.supplier_list_activity:
mActivityTv.setTextColor(Color.parseColor("#893c69"));
listView.setAdapter(mMenuAdapter3);
popupWindow.showAsDropDown(mActivity,0,2);
menuIndex = 2;
break;
default:
break;
}
}
}
MainActivity布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:background="@color/app_yellow"
android:layout_width="match_parent"
android:layout_height="45dp">
<TextView
android:textColor="@color/white"
android:textSize="20dp"
android:text="周边"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
/>
</android.support.v7.widget.Toolbar>

<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#E2E2E2"
/>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@color/white"
android:orientation="horizontal"
>

<LinearLayout
android:id="@+id/supplier_list_product"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:orientation="horizontal"
android:gravity="center"
>

<TextView
android:id="@+id/supplier_list_product_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="全部"
android:textColor="#000000"
android:textSize="14dp"
/>

<ImageView
android:layout_width="25dp"
android:layout_height="25dp"
android:src="@mipmap/icon_arrow_down"/>
</LinearLayout>
<LinearLayout
android:id="@+id/supplier_list_sort"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:orientation="horizontal"
android:gravity="center"
>

<TextView
android:id="@+id/supplier_list_sort_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="综合排序"
android:textColor="#000000"
android:textSize="14dp"
/>

<ImageView
android:layout_width="25dp"
android:layout_height="25dp"
android:src="@mipmap/icon_arrow_down"/>
</LinearLayout>
<LinearLayout
android:id="@+id/supplier_list_activity"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:orientation="horizontal"
android:gravity="center"
>

<TextView
android:id="@+id/supplier_list_activity_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14dp"
android:text="优惠活动"
/>

<ImageView
android:layout_width="25dp"
android:layout_height="25dp"
android:src="@mipmap/icon_arrow_down"/>
</LinearLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#E2E2E2"/>
<RelativeLayout
android:background="#ffffff"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/supplier_list_lv"
android:cacheColorHint="#00000000"
android:divider="#f0f0f0"
android:dividerHeight="10dp"
android:fadingEdge="none"
android:scrollbarStyle="outsideOverlay"
android:listSelector="#00000000"
android:scrollingCache="true"
android:layout_marginTop="10dp"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</RelativeLayout>

</LinearLayout>为PopUpwindow写的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffffff"
android:orientation="vertical" >

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal" >

<TextView
android:id="@+id/listview_popwind_tv"
android:layout_width="match_parent"
android:layout_height="45dp"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:gravity="center_vertical"
android:text="地点"
android:textColor="#5a5959"
android:textSize="18dp" />
</LinearLayout>

<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:background="#E2E2E2" />

</LinearLayout>替换的碎片布局:
下面的LinearLayout是设置点击事件用来关闭PopUpwindow使用的

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:background="#5000"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/popwin_supplier_list_lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cacheColorHint="#00000000"
android:divider="#0000"
android:dividerHeight="0dp"
android:fadingEdge="none"
android:listSelector="#00000000"
android:scrollbarStyle="insideOverlay"
android:scrollbars="none"
android:scrollingCache="false"></ListView>

<LinearLayout
android:layout_weight="1"
android:id="@+id/popwin_supplier_list_bottom"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="0dp"></LinearLayout>
</LinearLayout>效果图:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: