PopupWindow使用詳解(一)中文API文件贈送ListPopupWindow中文API
筆者數了數枕巾脫落的頭髮,發現了 Android 開發常用的類似於彈窗的懸浮視窗 大概是 PopupWindow 和 dialog。之前有還算具體的寫過關於 dialog 以及自定義 dialog 甚至是 dialogActivity 的相關筆記,即:Android 系統原生dialog使用 、Android dialog Activity 使用 、android自定義相對複雜dialog 。突然感覺 PopupWindow 這個說簡單不簡單,說難不難的知識點也應該詳細研究一下。
下面迴歸正題,請欣賞筆者的表演:
一、建立 PopupWindow
先說一下 Google 爸爸提供的構造方法
public PopupWindow()
public PopupWindow(View contentView)
public PopupWindow(int width, int height)
public PopupWindow(View contentView, int width, int height)
public PopupWindow(View contentView, int width, int height, boolean focusable)
public PopupWindow(Context context)
public PopupWindow(Context context, AttributeSet attrs)
public PopupWindow(Context context, AttributeSet attrs, int defStyleAttr)
public PopupWindow(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
數一數不多不少 9 個構造方法,一個無參的 8 個有參的,引數代表的意思分別為:View contentView
表示該 PopupWindow 內裝載的內容,即展示各位使用者的內容int width, int height
表示該 PopupWindow 物件的長度和寬度,引數可以是 ViewGroup.LayoutParams.WRAP_CONTENT
和ViewGroup.LayoutParams.MATCH_PARENT
也可以是具體的數值了。但是 這裡規定的 是 PopupWindow 內載入到的 view 物件的大小。相當於 PopupWindow 設定的值 為 xml 內最外層佈局是等效的。
如果,需要控制載入展示的 view 大小,那麼需要將該引數設定ViewGroup.LayoutParams.WRAP_CONTENT
並且 目標樣式外再包裹一層佈局,類似於:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_centerInParent="true">
<ImageView
android:id="@+id/iv_home"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/app_name"
android:src="@mipmap/home" />
</RelativeLayout>
</RelativeLayout>
boolean focusable
PopupWindow 響應內部的點選事件,例如 TextView、Button 等Context context
上下文,不多講
剩下下面的三個構造方法,不常用,但是會自定義 view 的大佬都知道啥意思。
二、常用設定方法
//設定動畫特效 即 展示和消失動畫
public void setAnimationStyle(int animationStyle)
//主要作用是為了設定 PopupWindow 顯示的時候是否會與 StatusBar 重疊(如果存在的話也包括 SystemBar )
public void setAttachedInDecor(boolean enabled)
//設定 PopupWindow 的背景。該屬性不設定的會,會導致 PopupWindow 出現後不會消失,即便是 點選 back 鍵也不起作用。這應該是 PopupWindow 較為變態的地方。
public void setBackgroundDrawable(Drawable background)
//設定 PopupWindow 允許超出視窗
public void setClippingEnabled(boolean enabled)
//設定 PopupWindow 內展示的內容
public void setContentView(View contentView)
//設定 PopupWindow 的高度,類似於 3D 效果的陰影
public void setElevation(float elevation)
//設定 PopupWindow的入場動畫
public void setEnterTransition(Transition enterTransition)
//有如就得有出 設定出場動畫
public void setExitTransition(Transition exitTransition)
//設定 popupWindow 是否可以獲取焦點
public void setFocusable(boolean focusable)
//設定 PopupWindow的高度
public void setHeight(int height)
//臉頰事件 Events 都是有大小的當觸控點大於手指頭大小時,則為 臉頰事件 ,蠻有意思的 你可以嘗試一下。
public void setIgnoreCheekPress()
//設定輸入法的操作模式
public void setInputMethodMode(int mode)
//監聽 PopupWindow關閉的事件
public void setOnDismissListener(OnDismissListener onDismissListener)
//設定 點選 PopupWindow意外區域,隱藏 popupWindow 然而並沒有什麼卵用
public void setOutsideTouchable(boolean touchable)
// PopupWindow觸控時的監聽回撥
public void setTouchInterceptor(OnTouchListener l)
//設定 PopupWindow是否可觸控
public void setTouchable(boolean touchable)
//設定 popwindow 的寬度
public void setWidth(int width)
//設定 PopupWindow佈局型別
public void setWindowLayoutType(int layoutType)
設定 PopupWindow 顯示位置 相對重要 拿出來寫
//設定 PopupWindow 在某個控制元件的下方,某控制元件的左下角與 PopupWindow 的左上角對齊
public void showAsDropDown(View anchor)
//設定 PopupWindow 在某個控制元件的下方,某控制元件的左下角與 PopupWindow 的左上角對齊,可以設定偏移量 向左為副 ,向右為正;向上為負,向下為正
public void showAsDropDown(View anchor, int xoff, int yoff)
//設定 PopupWindow 在相當於父佈局進行擺放,可以設定偏移量。
public void showAtLocation(View parent, int gravity, int x, int y)
//隱藏 PopupWindow
public void dismiss()
三、常用獲取方法
//獲取 PopupWindow 動畫樣式
public int getAnimationStyle()
//獲取 PopupWindow 背景
public Drawable getBackground()
//獲取 PopupWindow 設定的 view 返回一個view物件
public View getContentView()
//獲得 PopupWindow 的懸浮高度
public float getElevation()
//獲取 PopUpWindow 的入場動畫
public float getElevation()
//獲取 PopupWindow 的出場動畫
public Transition getExitTransition()
//獲取 PopupWindow 的高度
public int getHeight()
//獲取輸入模式
public int getInputMethodMode()
//獲取 PopupWindow 是否應該與寄生(不太合理但是不知道用啥詞)物件重疊
public boolean getOverlapAnchor()
//獲取 Popwindow 的寬度
public int getWidth()
//獲取 PopupWindow 的佈局型別
public int getWindowLayoutType()
//獲取可以讓 PopupWindow 設定的最大高度
public int getMaxAvailableHeight(View anchor)
public int getMaxAvailableHeight(View anchor, int yOffset)
//獲取可以設定 PopupWindow 的最大高度,可以忽略軟鍵盤。
public int getMaxAvailableHeight(
View anchor, int yOffset, boolean ignoreBottomDecorations)
四、常用判斷方法
//判斷 PopupWindow 是否在超出父佈局
public boolean isAboveAnchor()
// 判斷 PopupWindow 是否在父佈局的 裝飾上
public boolean isAttachedInDecor()
//判讀 PopupWindow 是否可以超出視窗
public boolean isClippingEnabled()
//判斷 PopupWindow 是否可以獲取焦點
public boolean isFocusable()
//判斷 PopupWindow 是否相應自身以外的點選事件
public boolean isOutsideTouchable()
//判斷 PopupWindow 是否展示
public boolean isShowing()
//判斷 PopupWindow 是否支援多點觸控
public boolean isSplitTouchEnabled()
//判斷 PopupWindow 是否支援觸控事件
public boolean isTouchable()
五、不常使用 更新位置或更新內容方法
//更新當前 PopupWindow
public void update()
//更新 Popwindow 到新的形態 引數:長度、寬度
public void update(int width, int height)
//更新 Popwindow 到新的位置、新的形態 引數:新位置的座標,長度、寬度
public void update(int x, int y, int width, int height)
//同上
public void update(int x, int y, int width, int height, boolean force)
//相對於宿主 更新體型
public void update(View anchor, int width, int height)
//相對宿主更新 大小 位置
public void update(View anchor, int xoff, int yoff, int width, int height)
六、部分主要事項
1、
PopupWindow 預設是不允許超出視窗的,具體演示請看下篇筆記;
2、
PopupWindow 的 public void setOutsideTouchable(boolean touchable)
方法預設沒有什麼卵用 ,是否可以點選 PopupWindow 外部進行隱藏 PopupWindow ,必須設定 public void setBackgroundDrawable(Drawable background)
該方法
3、
getHeight()
和 getWidth()
方法不太好用,一般返回為 0;如果獲取 PopupWindow 的長寬建議使用如下方法:
devPop.getContentView().measure(0, 0);
int hight=devPop.getContentView().getMeasuredHeight();
int width=devPop.getContentView().getMeasuredWidth();
4、
將 PopupWindow 的四角設定為圓角方法,可以將事先準備的 view 的父佈局加一個帶有圓角的 shape background, 之後設定 PopupWindow 的 setBackgroundDrawable() 方法 設定為devPop.setBackgroundDrawable(new ColorDrawable(0x00ffffff));
5、
一定要在顯示 PopupWindow 的介面的 OnDestroy()方法內呼叫 dismiss()方法,否則會產生 “意想不到”的驚喜。
@Override
protected void onDestroy() {
super.onDestroy();
if (popupWindow != null) {
popupWindow.dismiss();
}
}
6、
筆者遇到的注意事項,感覺目前就這麼多了,之後如果遇到還會補充;
七、附贈 ListPopupWindow 相關漢語 API
1、效果展示
或許各位很多人都知道 PopupWindow 但是 少有人知道 ListPopupWindow ,故 展示效果如下,具體應用 請留意之後的 筆記。
2、相關 API
繼承結構
(1)、構造方法
public ListPopupWindow( Context context)
public ListPopupWindow( Context context, AttributeSet attrs)
public ListPopupWindow( Context context, AttributeSet attrs,int defStyleAttr)
public ListPopupWindow(Context context, AttributeSet attrs,int defStyleAttr, int defStyleRes)
構造方法就這四種,筆者常用的是第一種。
(2)、設定類方法
//為列表設定 介面卡
public void setAdapter( ListAdapter adapter)
//設定錨點 view 寄生的view
public void setAnchorView(@Nullable View anchor)
//為 ListPopupWindow 設定動畫樣式
public void setAnimationStyle( int animationStyle)
//為 ListPopupWindow 設定背景
public void setBackgroundDrawable( Drawable d)
//設定 ListPopupWindow 的寬度 單位:畫素
public void setContentWidth(int width)
//設定下拉選單的對齊方式
public void setDropDownGravity(int gravity)
//設定 ListPopupWindow 的高度 單位:畫素
public void setHeight(int height)
//設定橫向偏移量 單位:畫素
public void setHorizontalOffset(int offset)
//設定 Drawable 為列表的選擇器
public void setListSelector(Drawable selector)
//將 ListPopupWindow 設定為模態框
public void setModal(boolean modal)
//設定 ListPopupWindow 提示位置
public void setPromptView( View prompt)
//設定 ListPopupWindow 的選定位置
public void setSelection(int position)
//設定 ListPopupWindow 輸入區域的輸入模式
public void setSoftInputMode(int mode)
//設定 ListPopupWindow 的豎直方向偏移量
public void setVerticalOffset(int offset)
//設定 ListPopupWindow 的寬度
public void setWidth(int width)
//設定 ListPopupWindow 的佈局型別
public void setWindowLayoutType(int layoutType)
// 可將返回物件 新增到 源檢視中,進而實現拖動並開啟。
public OnTouchListener createDragToOpenListener(View src)
//展示 ListPopupWindow
public void show()
(3)、監聽器
//設定 ListPopupWindow 關閉的 時的監聽
public void setOnDismissListener(PopupWindow.OnDismissListener listener)
//設定 ListPopupWindow 的 item 單擊時的監聽回撥
public void setOnItemClickListener(AdapterView.OnItemClickListener clickListener)
//設定 ListPopupWindow item 被選擇 時的監聽回撥
public void setOnItemSelectedListener(OnItemSelectedListener selectedListener)
(4)、獲取方法
//獲取 ListPopupWindow 的錨點 view
public View getAnchorView()
//獲取 ListPopupWindow 的動畫樣式
public int getAnimationStyle()
//獲取 ListPopupWindow 的背景
public Drawable getBackground()
//獲取 ListPopupWindow 的高度
public int getHeight()
//獲取 ListPopupWindow 的橫向偏移量
public int getHorizontalOffset()
//獲取 ListPopupWindow 的 列表
public ListView getListView()
//獲取可選的 ListPopupWindow 的位置
public int getPromptPosition()
//獲取 ListPopupWindow 內被選中的 item
public Object getSelectedItem()
//獲取被選中的 item 的 id
public long getSelectedItemId()
//獲取被選中的 item 的位置
public int getSelectedItemPosition()
//獲取被選中的 view
public View getSelectedView()
//獲取 垂直方向的偏移量 單位:畫素
public int getVerticalOffset()
//獲取 ListPopupWindow 的寬度
public int getWidth()
(5)、判斷方法
//判斷是否為 模態框樣式
public boolean isModal()
//判斷是否為顯示狀態
public boolean isShowing()
//過了關鍵按鍵 點選事件
public boolean onKeyDown(int keyCode, KeyEvent event)
//過濾關鍵按鍵 點選抬起事件
public boolean onKeyUp(int keyCode, KeyEvent event)
//判斷 是否 在指定 item 下執行點選事件
public boolean performItemClick(int position)
(6)、其他的重要方法
//執行相關 對 ui 執行緒的操作
public void postShow()
//刪除 當前列表的所有選擇
public void clearListSelection()
//關閉 ListPopupWindow
public void dismiss()
3、關於 ListPopupWindow 的其它 雜談
當發現這個 ListPopupWindow 算是控制元件的工具值,筆者捨去很多地方的 ListView 和部分AutoCompleteTextView 和 Spinner 控制元件使用,因為 ListPopupWindow 搭配 TextView 或者搭配 EditText 極其好用。
今天學習就到這裡,筆者希望可以幫助各位在夥伴,歡迎大佬指點、批評還有建議;
之後的幾篇筆者儘快寫出來,只是一些 關於 ListPopupWindow 和 PopupWindow 的具體用法,相關原始碼會上傳 github ;
不介意各位讀者,幫忙點個心或者是加個關注哈 (︶.̮︶) !
相關文章
- POI匯入Excel中文API文件ExcelAPI
- Koa v2.x 中文文件 APIAPI
- XMemcached 中文apiAPI
- ext 線上中文apiAPI
- JFreeChart中文APIAPI
- JAVA EE 中文APIJavaAPI
- jQuery EasyUI API 中文文件 - 表單(form補充)jQueryUIAPIORM
- WebUploader API 文件詳細解讀WebAPI
- java Ajax ext之API文件詳解JavaAPI
- Android2.2 API 中文文件系列(4) —— ManifestAndroidAPI
- Android2.2 API 中文文件系列(3) —— AccessibilityServiceAndroidAPI
- jQuery AjaxUpload中文使用API和demo示例jQueryAPI
- bigbluebutton中文社群 / 開放API / bbb APIAPI
- Sun 中國技術社群釋出Java API文件中文版JavaAPI
- ExtJs2.2中文版API幫助文件JSAPI
- Android中文API(137) —— LocalSocketAndroidAPI
- DOJO API 中文參考手冊API
- mori.js 中文API(親測)JSAPI
- java.util.concurrent中文APIJavaAPI
- 支援Java API Docs中文版JavaAPI
- 淘寶API介面AG文件接入呼叫方法詳解API
- IdentityServer4 中文文件 -10- (快速入門)使用密碼保護APIIDEServer密碼API
- API文件使用方法API
- 詳解空氣質量API 使用API
- Android中PopupWindow使用詳解Android
- [Android]中文API(一)android包下的那些類AndroidAPI
- java氣泡排序-選擇排序-插入排序-使用API中文文件直接呼叫函式Java排序API函式
- Android中文API(129) —— AudioManagerAndroidAPI
- Android 中文 API (40) —— RatingBarAndroidAPI
- Android中文API(128) —— HandlerThreadAndroidAPIthread
- ASP.NET Web API 中文版ASP.NETWebAPI
- 一文詳解Kafka APIKafkaAPI
- 使用google翻譯 api 翻譯中文成其他語言GoAPI
- API文件API
- Canvas API 詳解CanvasAPI
- api和api幫助文件API
- api中文化之Rust-curl(上)APIRust
- iOS之runtime詳解api(一)iOSAPI