Popup Window的創建及其基本屬性
- 一:功能概述
- 二:創建基本流程
- 1:創建XML布局檔案(要展示的彈出布局)
- 2:創建私有方法來撰寫Popup Window邏輯代碼
- 3:在合適地方彈出該Popup Window(或動作監聽內)
- 三:基本屬性
- 1:PopupWindow可以設定彈出/消失影片,且簡單
- 2:PopupWindow可以設定彈出位置(居中、頂部、底部、動態指定高度)
- 四:注意事項
一:功能概述
PopupWindow 是一個可以在Activity 之上顯示任意View的控制元件,在Android經常使用,效果跟Dialog 效果類似,不同點在于可以控制顯示的位置,比如底部顯示等,側邊顯示等,
二:創建基本流程
1:創建XML布局檔案(要展示的彈出布局)
(這里展示的僅僅是布局而已,隨意寫的,讀者不要認為代碼太長、太復雜放棄了,實際上在activity里怎么寫的布局就在這里面寫布局,這里模仿的是qq瀏覽器底部選單欄的彈出界面)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorAccent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:id="@+id/layout_1"
android:layout_marginTop="10dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="1">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/image_1"
android:background="@mipmap/ic_launcher"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text_view_1"
android:text="Page Ctrl"
android:layout_gravity="center_horizontal"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="1">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/image_2"
android:background="@mipmap/ic_launcher"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text_view_2"
android:text="Download Pic"
android:textSize="11sp"
android:layout_gravity="center_horizontal"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="1">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/image_3"
android:background="@mipmap/ic_launcher"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text_view_3"
android:textSize="12sp"
android:text="Add Bookmark"
android:layout_gravity="center_horizontal"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="1">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/image_4"
android:background="@mipmap/ic_launcher"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text_view_4"
android:text="History/Bookmark"
android:textSize="10sp"
android:layout_gravity="center_horizontal"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="1">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/image_5"
android:background="@mipmap/ic_launcher"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text_view_5"
android:text="Share"
android:layout_gravity="center_horizontal"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:id="@+id/layout_2"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="1">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/image_6"
android:background="@mipmap/ic_launcher"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text_view_6"
android:text="Refresh"
android:layout_gravity="center_horizontal"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="1">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/image_7"
android:background="@mipmap/ic_launcher"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text_view_7"
android:text="Soul"
android:layout_gravity="center_horizontal"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="1">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/image_8"
android:background="@mipmap/ic_launcher"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text_view_8"
android:text="Translate"
android:layout_gravity="center_horizontal"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="1">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/image_9"
android:background="@mipmap/ic_launcher"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text_view_9"
android:text="Night Mode"
android:layout_gravity="center_horizontal"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="1">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/image_10"
android:background="@mipmap/ic_launcher"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text_view_10"
android:text="Settings"
android:layout_gravity="center_horizontal"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
效果圖:

2:創建私有方法來撰寫Popup Window邏輯代碼
private void showPopupWindow(){
View contentView = LayoutInflater.from(MainActivity.this).inflate(R.layout.popup_window, null);
PopupWindow popupWindow = new PopupWindow(contentView,
WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT,true);
ImageView imageViewOne = (ImageView)contentView.findViewById(R.id.image_1);
ImageView imageViewTwo = (ImageView)contentView.findViewById(R.id.image_2);
ImageView imageViewThree = (ImageView)contentView.findViewById(R.id.image_3);
ImageView imageViewFour = (ImageView)contentView.findViewById(R.id.image_4);
ImageView imageViewFive = (ImageView)contentView.findViewById(R.id.image_5);
ImageView imageViewSix = (ImageView)contentView.findViewById(R.id.image_6);
ImageView imageViewSeven = (ImageView)contentView.findViewById(R.id.image_7);
ImageView imageViewEight = (ImageView)contentView.findViewById(R.id.image_8);
View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.activity_main,null);
popupWindow.showAtLocation(view, Gravity.BOTTOM,0,getLayoutHeight());
}
說明:第一步先創建view物件來系結xml布局,接著創建PopupWindow實體,對于接下來的控制元件的加載注冊與碎片很相似,都是依附于開頭提到的view物件,
最后兩行代碼是將要展示的Popup Window設定展示的位置,如若想讓展示的控制元件點擊有效果,只需設定監聽即可:
private void showPopupWindow(){
View contentView = LayoutInflater.from(MainActivity.this).inflate(R.layout.popup_window, null);
popupWindow = new PopupWindow(contentView,
WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT,true);
ImageView imageViewOne = (ImageView)contentView.findViewById(R.id.image_1);
ImageView imageViewTwo = (ImageView)contentView.findViewById(R.id.image_2);
ImageView imageViewThree = (ImageView)contentView.findViewById(R.id.image_3);
ImageView imageViewFour = (ImageView)contentView.findViewById(R.id.image_4);
ImageView imageViewFive = (ImageView)contentView.findViewById(R.id.image_5);
ImageView imageViewSix = (ImageView)contentView.findViewById(R.id.image_6);
ImageView imageViewSeven = (ImageView)contentView.findViewById(R.id.image_7);
ImageView imageViewEight = (ImageView)contentView.findViewById(R.id.image_8);
imageViewOne.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"MB_OK.",Toast.LENGTH_SHORT).show();
}
});
imageViewTwo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"MB_OK.",Toast.LENGTH_SHORT).show();
}
});
imageViewThree.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"MB_OK.",Toast.LENGTH_SHORT).show();
}
});
imageViewFour.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"MB_OK.",Toast.LENGTH_SHORT).show();
}
});
imageViewFive.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"MB_OK.",Toast.LENGTH_SHORT).show();
showSecondPopupWindow();
popupWindow.dismiss();
}
});
imageViewSix.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"MB_OK.",Toast.LENGTH_SHORT).show();
}
});
imageViewSeven.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"MB_OK.",Toast.LENGTH_SHORT).show();
}
});
imageViewEight.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"MB_OK.",Toast.LENGTH_SHORT).show();
}
});
View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.activity_main,null);
popupWindow.showAtLocation(view, Gravity.BOTTOM,0,getLayoutHeight());
}
3:在合適地方彈出該Popup Window(或動作監聽內)
showPopupWindow();
注意該方法是我們自定義提出的,不是系統提供的,
如果想關閉,只需如下即可:
popupWindow.dismiss();
另外還需注意的是這里的PopupWindow物件應該是類成員變數而非方法,否則在其它地方是訪問不了該屬性的,我這里為了方便演示,在一開始的java代碼里寫成方法變數,實際上應該寫成類成員變數來訪問,
三:基本屬性
1:PopupWindow可以設定彈出/消失影片,且簡單
java代碼如下:
popupWindow.setAnimationStyle(R.style.MyPopupWindow_anim_style);
這里需要在res目錄i下新建anim檔案夾,接著原封不動把這兩個檔案拷過去(一個控制彈出影片引數,一個控制彈出)即可

poupwindow_hidden_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="160"
android:fromYDelta="0"
android:toYDelta="10%p" />
<alpha
android:duration="160"
android:fromAlpha="1.0"
android:toAlpha="0.0" />
</set>
poupwindow_show_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="160"
android:fromYDelta="10%p"
android:toYDelta="0" />
<alpha
android:duration="160"
android:fromAlpha="0.0"
android:toAlpha="1.0" />
</set>
2:PopupWindow可以設定彈出位置(居中、頂部、底部、動態指定高度)
PopupWindow的showAtLocation()第二個引數可以控制彈出位置
| 引數 | 說明 |
|---|---|
Gravity.BOTTOM | 底部 |
Gravity.TOP | 頂部 |
Gravity.CENTER | 中央 |
Gravity.RIGHT | 左側 |
Gravity.LEFT | 右側 |
這里只是指定固定的位置(相對于螢屏),但要想動態地指定高度,例如指定該PopupWindow位于某控制元件上方,某控制元件上方偏移多少dp,需要自定義一個私有方法,在第四個引數內呼叫該方法即可,
例如,該自定義方法是計算某LinearLayout的高度:
private int getLayoutHeight(){
int height;
layout2 = (LinearLayout)findViewById(R.id.layout_2);
height = layout2.getHeight();
return height;
}
showAtLocation()第四個引數為y,意為PopupWindow偏移第二個引數的位置,即向上或向下偏移多少
四:注意事項
PopupWindow布局不要設定為透明,否則必須點擊非透明部分才會起作用,初學者在練習該內容時,注意要把PopupWindow變數設定為類成員變數,否則在其它地方呼叫dismiss()方法時會報錯,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/210053.html
標籤:java
上一篇:JAVA開發規范隨筆
