PopupWindow(懸浮框)的基本使用


本節引言:

本節帶給大家的是最後一個用來顯示訊息的UI控制項-PopupWindow(懸浮框),如果你想知道 他長什麼樣子,你可以打開你手機的QQ,長按清單中的某項,這個時候後彈出一個黑色的小 對話框,這種就是PopupWindow了,和AlertDialog對話框不同的是,他的位置可以是隨意的;

另外AlertDialog是非堵塞線程的,而PopupWindow則是堵塞線程的!而官方有這樣一句話來介紹 PopupWindow:

A popup window that can be used to display an arbitrary view. The popup window is

#a floating container that appears on top of the current activity.

大概意思是:一個彈出視窗控件,可以用來顯示任意View,而且會浮動在目前activity的頂部

下面我們就來對這個控件進行學習~

官方文件:PopupWindow


1.相關方法解讀


1)幾個常用的建構方法

我們在文件中可以看到,提供給我們的PopupWindow的建構方法有九種之多,這裡只貼實際 開發中使用較多的幾個建構方法:

  • public PopupWindow (Context context)
  • public PopupWindow(View contentView, int width , int height)
  • public PopupWindow(View contentView)
  • ##public PopupWindow(View contentView, int width, int height, boolean focusable)
參數就不用多解釋了吧,contentView是PopupWindow顯示的View,focusable是否顯示焦點


2)常用的一些方法

以下介紹幾個用得較多的一些方法,其他的可自行查閱文件:

  • setContentView(View contentView):設定PopupWindow顯示的View
  • getContentView():取得PopupWindow顯示的View
  • showAsDropDown(View anchor):相對某個控制項的位置(正左下方),無偏移
  • showAsDropDown(View anchor, int xoff, int yoff) :相對某個控制項的位置,有偏移
  • showAtLocation(View parent, int gravity, int x, int y): 相對於父控制的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以設定偏移或無偏移 PS:parent這個參數只要是activity中的view就可以了!
  • setWidth/setHeight:設定寬高,也可以在建構法指定好寬高, 除了可以寫具體的值,還可以用WRAP_CONTENT或MATCH_PARENT, popupWindow的width和height屬性直接和第一層View相對應。
  • setFocusable(true):設定焦點,PopupWindow彈出後,所有的觸控螢幕和實體按鍵都由PopupWindows 處理。其他任何事件的回應都必須發生在PopupWindow消失之後,(home 等系統層面的事件除外)。 例如這樣一個PopupWindow出現的時候,按back鍵先是讓PopupWindow消失,第二次按才是退出 activity,準確的說是想退出activity你得首先讓PopupWindow消失,因為不併是任何情況下按back  PopupWindow都會消失,必須在PopupWindow設置了背景的情況下 。
  • setAnimationStyle(int):設定動畫效果

2.使用程式碼範例

##運行效果圖

1.gif

實作關鍵程式碼

先貼動畫檔案:

anim_pop.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android. com/apk/res/android">
    <alpha android:fromAlpha="0"
        android:toAl ) /alpha>
</set>

#

連結是popupWindow的佈局:item_popip.xml

#
< ;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    "../style/images/ic_pop_bg"
    android:orientation="vertical">

    #        「wrap_content"
        android:layout_height="wrap_content"
        android:padding="5dp " />

    <按鈕
        android:id="@+id/btn_hehe"
        and     android:padding= "5dp"
        android:text="呵呵"
        android:textSize="18sp" />







############################################################################################################################################################################################

MainActivity.java

公共類別MainActivity 擴充AppCompatActivity {

    私有按鈕btn_show;
#    私有上下文mContext;

    # #        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);# ࠠ). btn_show = (Button) findViewById(R.id.btn_show);
btn_show .setOnClickListener(new View.OnClickListener() {
            @Override
                initPopWindow(v);
            }
       

#    private void initPopWindow(View v) {
        View view = LayoutInflater.    按鈕 btn_xixi = (按鈕) view.findViewById(R.id.btn_xixi);
        Button btn_hehe = (Button) view.findViewById(R.id.高
        final PopupWindow popWindow = new PopupWindow(view,
           , true);

        popWindow.setAnimationStyle(R.anim.anim_pop);  //設定載入動畫

        //這些要點選非PopupWindow區域,PopupWindow會消失的,如果沒有下面的
        //代碼的話,你會發現,當你把PopPopdow出來顯示了,或是Window你按幾次後退鍵
        //PopupWindow並不會關閉,且退出不出程序,加上下面的程式碼可以解決這個問題
popWindow.setTouchable(true);
        popWindow.setTouchInterceptor(new View.OnTouchListener() {
      onTouch(View v, MotionEvent event) {
                return false     / 這裡如果返回true的話,touch事件將被攔截
                // 攔截後 PopupWindow的onTouchEvent卡   });
        popWindow.setBackgroundDrawable(new ColorDrawable(0x00000000));    //要為popWindow設定背景才有效


        //設定popupWindow軸的位置,參數依序為參考View,x   //設定popupWindow軸的位置,參數依序為參考View,x軸的偏移量移量
        popWindow.showAsDropDown(v, 50, 0);

        //設定popupWindow集的按鈕的事件##  {
            @Override
            public void onClick(View v) {
             ;
            }
#        });
        btn_hehe.setOnClickListener(new View.OnClickListener() {
          {
                Toast.makeText(MainActivity.this, "你點選了呵呵~", Toast .LENGTH_SHORT).show();
                popWindow.dismiss();
}
        });
    }
}

3.範例程式碼下載

PopWindowDemo.zip


#3.範例程式碼下載

PopWindowDemo.zip




###############################11#######PopWindowDemo.zip##########本節小結:#########時間關係,並沒有想到好一點的範例,就寫了一個簡單的demo,應該能滿足簡單的需要,另外 如果想深入研究下PopupWindow的話可看下述的參考文獻:###Android PopupWindow的使用與分析###Android PopupWindow詳解###嗯,就說這麼多,謝謝~######## #