Android widget之PopupWindow

概述

Android應用中經(jīng)常會彈出一個窗體,進行一些操作,比如說分享母债、選擇城市等等副瀑,類似于AlertDialog,下面將詳細講解PopupWindow弓熏。
構造方法


PopupWindow的構造方法,官方給出的有9種糠睡,項目中常用的只有最后兩種

  1. PopupWindow(Context context)
    Create a new empty, non focusable popup window of dimension (0,0).
    創(chuàng)建一個寬度為0挽鞠、高度為0的無焦點的空彈窗。
    這種方法創(chuàng)建的彈窗狈孔,提供了背景
    context為上下文信认。

  2. PopupWindow(Context context, AttributeSet attrs)
    Create a new empty, non focusable popup window of dimension (0,0).
    創(chuàng)建一個寬度為0、高度為0的無焦點的空彈窗均抽。
    這種方法創(chuàng)建的彈窗嫁赏,提供了背景

  3. 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)建的彈窗潦蝇,提供了背景

  4. 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)建的彈窗攘乒,提供了背景

  5. 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)建的彈窗则酝,沒有背景,需要自己填充

  6. 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)容

  7. 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:彈窗的寬度

  8. 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);
  1. 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;
        }
    }
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摸吠,一起剝皮案震驚了整個濱河市空凸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寸痢,老刑警劉巖呀洲,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡道逗,警方通過查閱死者的電腦和手機兵罢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滓窍,“玉大人卖词,你說我怎么就攤上這事±艉唬” “怎么了此蜈?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長噪生。 經(jīng)常有香客問我裆赵,道長,這世上最難降的妖魔是什么跺嗽? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任战授,我火速辦了婚禮,結果婚禮上桨嫁,老公的妹妹穿的比我還像新娘陈醒。我一直安慰自己,他們只是感情好瞧甩,可當我...
    茶點故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布钉跷。 她就那樣靜靜地躺著,像睡著了一般肚逸。 火紅的嫁衣襯著肌膚如雪爷辙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天朦促,我揣著相機與錄音膝晾,去河邊找鬼。 笑死务冕,一個胖子當著我的面吹牛血当,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播禀忆,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼臊旭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了箩退?” 一聲冷哼從身側響起离熏,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎戴涝,沒想到半個月后滋戳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钻蔑,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年奸鸯,在試婚紗的時候發(fā)現(xiàn)自己被綠了咪笑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,629評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡娄涩,死狀恐怖蒲肋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钝满,我是刑警寧澤兜粘,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站弯蚜,受9級特大地震影響孔轴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碎捺,卻給世界環(huán)境...
    茶點故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一路鹰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧收厨,春花似錦晋柱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拧额,卻和暖如春碑诉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背侥锦。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工进栽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恭垦。 一個月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓快毛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親番挺。 傳聞我的和親對象是個殘疾皇子唠帝,可洞房花燭夜當晚...
    茶點故事閱讀 43,499評論 2 348

推薦閱讀更多精彩內(nèi)容