最近項目中有用PopupWindow。我在其中添加一個ListView放入PopupWindow中,然後對對PopupWindow設置了setFocusable(true)讓PopupWindow獲得了焦點。初始化
PopupWindow parameterView=this.getLayoutInflater().inflate(R.layout.parameterpopup, null);
parametPopLayout=(LinearLayout)parameterView.findViewById(R.id.parametPopLayout);parameter_list=(ListView)parameterView.findViewById(R.id.parameter_list);
parameterPop = new PopupWindow(parameterView, 140, ViewGroup.LayoutParams.WRAP_CONTENT);
parameterPop.setOutsideTouchable(true);
這時候問題來了當你點擊頁面中其它控件是無法響應的。發現很多人都有遇到這個困惑。其實你可以通過pw(PopupWindow對象).getContextView()拿到他的父視圖。然後通過給父視圖註冊事件 讓pw失去焦點 。我項目中是通過一個按鈕點擊之後顯示pw.如下:
實例化按鈕
Java代碼
imgbtn=(ImageButton)map.findViewById(R.id.imgBtn);
Java代碼
imgbtn.setOnClickListener(this);//註冊事件
Java代碼
parameterPop.setOutsideTouchable(true);
selectListAdapter adapter1=new selectListAdapter(this,showItem);
parameter_list.setAdapter(adapter1);
parameter_list.setOnItemClickListener(new OnItemClickListener(){
Java代碼
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
parameterPop.dismiss();
}
});
if(parameterPop.isShowing()){
parameterPop.dismiss();
}else{
showPop=true;
parameterPop.showAtLocation(v, Gravity.LEFT, 10, 40);
parameterPop.setFocusable(true);
parameterPop.update();
//做一個不在焦點外的處理事件監聽
parameterPop.getContentView().setOnTouchListener(new OnTouchListener(){
Java代碼
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
parameterPop.setFocusable(false);
parameterPop.dismiss();
return true;
}
});
}
從而解決了這個問題。還有一個問題就是如果當Pw顯示之後。你想按返回等系統鍵也是無法響應的。那我們應該如何來處理咧?相信看了上面代碼的應該會明白。要響應誰就交給誰。setFocusable(true)此時已經讓Pw獲取了焦點。解決辦法:因爲Pw裏放置了ListView。可以利用setOnKeyListener對Pw裏的ListView 設置監聽代碼如下:
Java代碼
parameter_list.setOnKeyListener(new OnKeyListener(){
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
parameterPop.dismiss();
return false;
}
});
就能解決當Pw顯示時 無法響應按手機返回等鍵了