概述
Android應用中經(jīng)常會彈出一個窗體,進行一些操作,比如說分享母债、選擇城市等等副瀑,類似于AlertDialog,下面將詳細講解PopupWindow弓熏。
構造方法
PopupWindow的構造方法,官方給出的有9種糠睡,項目中常用的只有最后兩種
PopupWindow(Context context)
Create a new empty, non focusable popup window of dimension (0,0).
創(chuàng)建一個寬度為0挽鞠、高度為0的無焦點的空彈窗。
這種方法創(chuàng)建的彈窗狈孔,提供了背景
context為上下文信认。PopupWindow(Context context, AttributeSet attrs)
Create a new empty, non focusable popup window of dimension (0,0).
創(chuàng)建一個寬度為0、高度為0的無焦點的空彈窗均抽。
這種方法創(chuàng)建的彈窗嫁赏,提供了背景PopupWindow(Context context, AttributeSet attrs, int defStyleAttr)
Create a new empty, non focusable popup window of dimension (0,0).
創(chuàng)建一個寬度為0、高度為0的無焦點的空彈窗油挥。
這種方法創(chuàng)建的彈窗潦蝇,提供了背景PopupWindow(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
Create a new empty, non focusable popup window of dimension (0,0).
創(chuàng)建一個寬度為0、高度為0的無焦點的空彈窗深寥。
這種方法創(chuàng)建的彈窗攘乒,提供了背景PopupWindow()
Create a new empty, non focusable popup window of dimension (0,0).
The popup does not provide any background. This should be handled by the content view.
創(chuàng)建一個寬度為0、高度為0的無焦點的空彈窗惋鹅。
這種方法創(chuàng)建的彈窗则酝,沒有背景,需要自己填充PopupWindow(View contentView)
Create a new non focusable popup window which can display the contentView. The dimension of the window are (0,0).
The popup does not provide any background. This should be handled by the content view.
創(chuàng)建一個寬度為0闰集、高度為0沽讹,可以自定義內(nèi)容的無焦點彈窗。
這種方法創(chuàng)建的彈窗沒有背景武鲁,需要自己填充
contentView:彈窗展示的內(nèi)容PopupWindow(int width, int height)
Create a new empty, non focusable popup window. The dimension of the window must be passed to this constructor.
The popup does not provide any background. This should be handled by the content view.
創(chuàng)建一個寬度為width鳞青、高度為height的無焦點空彈窗窄绒。
這種方法創(chuàng)建的彈窗沒有背景及穗,需要自己填充
height:彈窗的高度
width:彈窗的寬度PopupWindow(View contentView, int width, int height)
Create a new non focusable popup window which can display the contentView.
創(chuàng)建一個自定義寬度拙毫、高度、顯示內(nèi)容的無焦點彈窗。
contentView:自定義的彈窗顯示內(nèi)容
width:彈窗寬度
height:彈窗高度
舉個栗子
View view=getLayoutInflater().inflate(R.layout.window, null);
PopupWindow mPop =new
PopupWindow(view,LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
-
PopupWindow(View contentView, int width, int height, boolean focusable)
Create a new popup window which can display the contentView.
創(chuàng)建一個自定義寬度刽沾、高度本慕、顯示內(nèi)容、是否有焦點的彈窗侧漓。
contentView:自定義的彈窗顯示內(nèi)容
width:彈窗寬度
height:彈窗高度
focusable:是否有焦點锅尘,true:有焦點;false:無焦點(默認為false布蔗,與第8中構造方法效果相同)
舉個栗子
View view=getLayoutInflater().inflate(R.layout.window, null);
PopupWindow mPop =new
PopupWindow(view,LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT,true);
顯示方式
PopupWindow一般有兩種展示方法藤违,用showAsDropDown()和showAtLocation()兩種方法實現(xiàn)。一般參數(shù)有兩種纵揍,有偏移和無偏移顿乒。
官方的方法如下
showAsDropDown()
showAsDropDown(View anchor, int xoff, int yoff, int gravity)
showAsDropDown(View anchor, int xoff, int yoff)
-
showAsDropDown(View anchor)
anchor可以理解為錨,彈窗顯示在anchor下面泽谨,xoff為X軸偏移量璧榄,yoff為Y軸偏移量,gravity為顯示方式
上栗子 -
mPop.showAsDropDown(anchor);
彈窗顯示在anchor正下方吧雹,無任何偏移骨杂。 -
mPop.showAsDropDown(anchor,xoff,yoff);
彈窗在anchor下方顯示,X軸偏移xoff,Y軸偏移yoff雄卷。 -
mPop.showAsDropDown(anchor,xoff,yoff,Gravity.CENTER);
彈出在anchor下方居中顯示搓蚪,同時X軸偏移xoff,Y軸偏移yoff。
showAtLocation()
-
showAtLocation(View parent, int gravity, int x, int y)
按函數(shù)名來理解丁鹉,很容易看出該函數(shù)的意義妒潭,即在某個位置顯示彈窗,我們要做的就是為彈窗設置Location揣钦。
parent:彈窗顯示的父容器
gravity:顯示方式
x:X軸偏移量
y:Y軸偏移量
栗子來啦
mPop.showAtLocation(PopWindow.this.findViewById(R.id.rl),
Gravity.TOP | Gravity.LEFT, 20, 20);
在屏幕頂部|居右雳灾,X軸偏移20,Y軸偏移20拂盯;
實栗
這里實現(xiàn)一個常見的分享彈窗佑女,點擊彈窗外面或者點擊back鍵记靡,關閉彈窗
兩個布局文件谈竿,一個主界面布局文件、一個彈框內(nèi)容布局文件
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="showAsDropDown無偏移" />
<Button
android:id="@+id/btn2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="showAsDropDown有偏移" />
</LinearLayout>
popup_share.xml
<?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="match_parent"
android:background="@color/white">
<LinearLayout
android:layout_marginLeft="10dp"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/umeng_socialize_wechat"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="10sp"
android:textColor="@color/black"
android:layout_gravity="center"
android:text="微信好友"/>
</LinearLayout>
<LinearLayout
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/umeng_socialize_wxcircle"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="10sp"
android:textColor="@color/black"
android:layout_gravity="center"
android:text="微信朋友圈"/>
</LinearLayout>
<LinearLayout
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/umeng_socialize_qq_on"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="10sp"
android:textColor="@color/black"
android:layout_gravity="center"
android:text="QQ好友"/>
</LinearLayout>
<LinearLayout
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/umeng_socialize_qzone_on"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="10sp"
android:textColor="@color/black"
android:layout_gravity="center"
android:text="QQ空間"/>
</LinearLayout>
<LinearLayout
android:layout_marginRight="10dp"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/umeng_socialize_sina_on"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="10sp"
android:textColor="@color/black"
android:layout_gravity="center"
android:text="微博"/>
</LinearLayout>
</LinearLayout>
重新activity的onCreate方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
popupView= getLayoutInflater().inflate(R.layout.popup_share, null);
mPop = new PopupWindow(popupView,
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,true);
mPop.setBackgroundDrawable(new ColorDrawable(0));
btn1=(Button) findViewById(R.id.btn1);
btn1.setOnClickListener(this);
btn2=(Button) findViewById(R.id.btn2);
btn2.setOnClickListener(this);
}
兩種顯示方法的觸發(fā)事件
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.btn1:
mPop.showAsDropDown(btn1);
break;
case R.id.btn2:
mPop.showAsDropDown(btn2,290,-50);
break;
default:
break;
}
}