Android中PopupWindow,ListPopupWindow的使用

在開(kāi)發(fā)項(xiàng)目中會(huì)經(jīng)常遇到彈窗選擇的情況秀存,這時(shí)就會(huì)用到PopupWindow捶码,PopupWindow的用法比較簡(jiǎn)單,但不熟悉的情況下會(huì)遇到一些問(wèn)題或链,可能會(huì)花不短的時(shí)間來(lái)處理惫恼,這里簡(jiǎn)單總結(jié)一下可能會(huì)遇到的問(wèn)題。見(jiàn)下面代碼澳盐。

PopupWindow

final PopupWindow popupWindow =new PopupWindow(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);

popupWindow.setContentView(LayoutInflater.from(this).inflate(R.layout.popup_window, null));

popupWindow.setBackgroundDrawable(newColorDrawable(ContextCompat.getColor(this,R.color.half)));//設(shè)置背景色祈纯,需要設(shè)置令宿,不設(shè)置可能會(huì)造成返回鍵不起作用

//popupWindow.setBackgroundDrawable(ContextCompat.getDrawable(this,R.mipmap.ic_launcher));//設(shè)置背景圖

popupWindow.setFocusable(false);//物理鍵是否響應(yīng),為true時(shí)腕窥,點(diǎn)返回鍵 ?//popupWindow消失粒没,為false時(shí),點(diǎn)返回鍵activity消失簇爆。popupWindow.setOutsideTouchable(true);//點(diǎn)擊popupWindow外面消失popupWindow.setAnimationStyle(R.style.PopupWindow);//設(shè)置動(dòng)畫(huà)效果findViewById(R.id.popup_window).setOnClickListener(new View.OnClickListener() {

@Override

public voidonClick(View v) {

if(android.os.Build.VERSION.SDK_INT==24) {//在android 7.0中,當(dāng)popupWindow的高度 ?過(guò)大時(shí)癞松,調(diào)用showAsDropDown方法popupWindow可能會(huì)出現(xiàn)在view的上方或占滿全屏,這是android 7.0的bug入蛆,用這種方式可以正常顯示响蓉,7.1已經(jīng)修復(fù)這個(gè)bug

int[] a =new int[2];

v.getLocationInWindow(a);

popupWindow.showAtLocation(getWindow().getDecorView(),Gravity.NO_GRAVITY,0,a[1] + v.getHeight());

}else{

popupWindow.showAsDropDown(v);

}

}

});


代碼中注釋寫(xiě)的比較清楚了,需要注意的是PopupWindow要設(shè)置背景色安寺,以及可以通過(guò)設(shè)置setFocusable來(lái)實(shí)現(xiàn)點(diǎn)擊返回鍵是使PopupWindow消失還是直接finish當(dāng)前界面厕妖,另外還需要注重,在android 7.0系統(tǒng)中挑庶,當(dāng)PopupWindow中的視圖高度過(guò)大時(shí),PopupWindow會(huì)占滿全屏软能,這是系統(tǒng)的bug迎捺,需要做特殊處理,見(jiàn)上面代碼查排。

ListPopupWindow是api 11 之后新加的組件凳枝,在列表選擇時(shí)使用ListPopupWindow十分方便,他的用法和PopupWindow相識(shí)跋核,但增加了適配器adapter岖瑰,用法和listview一樣,如下砂代。

ListPopupWindow

final ListPopupWindow listPopupWindow =new ListPopupWindow(this);

listPopupWindow.setWidth(getResources().getDisplayMetrics().widthPixels);//設(shè)置寬度

listPopupWindow.setHeight(ListPopupWindow.MATCH_PARENT);//設(shè)置高度

listPopupWindow.setBackgroundDrawable(newColorDrawable(ContextCompat.getColor(this,R.color.half)));//設(shè)置背景色

listPopupWindow.setAdapter(newPopupWindowAdapter(this));

listPopupWindow.setAnchorView(findViewById(R.id.popup));

listPopupWindow.setModal(false);//設(shè)置為true響應(yīng)物理鍵listPopupWindow.setHorizontalOffset(100);//垂直間距l(xiāng)istPopupWindow.setVerticalOffset(100);//水平間距findViewById(R.id.popup).setOnClickListener(newView.OnClickListener() {

@Override

public void onClick(View v) {//同樣android 7.0有顯示問(wèn)題蹋订,通過(guò)重置高度可以解決。

if(Build.VERSION.SDK_INT==24) {

int[] a =new int[2];

v.getLocationInWindow(a);

listPopupWindow.setHeight(getResources().getDisplayMetrics().heightPixels- a[1] - v.getHeight());

}

listPopupWindow.show();

}

});

listPopupWindow.setOnItemClickListener(newAdapterView.OnItemClickListener() {//item 點(diǎn)擊事件

@Override

public void onItemClick(AdapterView parent,View view, intposition, longid) {

listPopupWindow.dismiss();

}

});

PopupWindowAdapter

public class PopupWindowAdapter extends BaseAdapter {

private Context context;

public PopupWindowAdapter(Context context) {

this.context= context;

}

@Override

public int getCount() {

return 10;

}

@Override

public Object getItem(intposition) {

return null;

}

@Override

public long getItemId(intposition) {

return0;

}

@Override

public View getView(intposition,View convertView,ViewGroup parent) {

ViewHolder viewHolder;

if(convertView ==null) {

convertView = LayoutInflater.from(context).inflate(R.layout.item_popup, null);

}else{

}

return convertView;

}

class ViewHolder {

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刻伊,一起剝皮案震驚了整個(gè)濱河市露戒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捶箱,老刑警劉巖智什,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異丁屎,居然都是意外死亡荠锭,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)晨川,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)证九,“玉大人键思,你說(shuō)我怎么就攤上這事「幔” “怎么了吼鳞?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)叫搁。 經(jīng)常有香客問(wèn)我赔桌,道長(zhǎng),這世上最難降的妖魔是什么渴逻? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任疾党,我火速辦了婚禮,結(jié)果婚禮上惨奕,老公的妹妹穿的比我還像新娘雪位。我一直安慰自己,他們只是感情好梨撞,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布雹洗。 她就那樣靜靜地躺著,像睡著了一般卧波。 火紅的嫁衣襯著肌膚如雪时肿。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,255評(píng)論 1 308
  • 那天港粱,我揣著相機(jī)與錄音螃成,去河邊找鬼。 笑死查坪,一個(gè)胖子當(dāng)著我的面吹牛寸宏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播偿曙,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼氮凝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了遥昧?” 一聲冷哼從身側(cè)響起覆醇,我...
    開(kāi)封第一講書(shū)人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎炭臭,沒(méi)想到半個(gè)月后永脓,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鞋仍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年常摧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡落午,死狀恐怖谎懦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情溃斋,我是刑警寧澤界拦,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站梗劫,受9級(jí)特大地震影響享甸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜梳侨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一蛉威、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧走哺,春花似錦蚯嫌、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至彼哼,卻和暖如春对妄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背敢朱。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摩瞎,地道東北人拴签。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像旗们,于是被迫代替她去往敵國(guó)和親蚓哩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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