2012-08-14 27 views
1

我實現了一個彈出窗口,當我按下硬件菜單鍵時彈出窗口。現在我想再次按下菜單鍵時關閉彈出窗口。按下選項菜單時關閉彈出框

我想這

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 

    if (keyCode == KeyEvent.KEYCODE_MENU) { 
     if (pw.isShowing()) { 
      pw.dismiss(); 
     } else { 
      openpopup(); 
     } 
     return true; 
    } 

    return super.onKeyDown(keyCode, event); 
} 

這裏的開放式彈出方法

public void openpop() { 
    View view1 = getCurrentFocus(); 
    showpopup(view1); 
} 

這裏的showpopup方法

public void showpopup(View view) { 

    pw.setTouchable(true); 
    pw.setFocusable(true); 
    pw.setTouchInterceptor(new OnTouchListener() { 
     public boolean onTouch(View v, MotionEvent event) { 
      if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { 
       pw.dismiss(); 

       return true; 
      } 

      return false; 
     } 
    }); 

    try { 
     pw.setWidth(WindowManager.LayoutParams.WRAP_CONTENT); 
     pw.setHeight(WindowManager.LayoutParams.WRAP_CONTENT); 
     pw.setOutsideTouchable(false); 
     pw.setContentView(popupView); 
     pw.showAsDropDown(view, 0, 0); 
     popUpShowed = true; 
    } catch (Exception e) { 
     Log.e("SAMPLE", "Exception", e); 
    } 

} 

但是,當我按下菜單彈出沒有被駁回。

可能是什麼問題?我需要以某種方式完成這件事。請幫助我。

+1

我確定你的彈出窗口會顯示並立即被解除。您能否將一條日誌消息放入每個偵聽器? (Log.i(「TEST」,「POPUP」))並告訴我它做了什麼。 – 2012-08-14 06:35:50

+0

我在每個聽衆都做過。當我按下菜單按鈕並顯示彈出窗口時,會出現日誌。一旦顯示彈出窗口,當我再次按下菜單關閉彈出窗口時,沒有任何反應,並且日誌沒有註冊。 – darsh 2012-08-14 06:53:06

回答

1

顯然,按菜單鍵第二次不會觸發。
Found here the solution
希望它有幫助。

編輯:
檢查並創建另一種方法。這應該這樣做:

boolean open = false; 
boolean itemSelected = false; 

@Override 
public boolean onMenuOpened(int featureId, Menu menu) { 

    if(!open || itemSelected) { 
     showPopup(); 
     open = true; 
     itemSelected = false; 
    } 
    return false; 
} 

@Override 
public void onPanelClosed(int featureId, Menu menu) { 
    if (open && !itemSelected) { 
     closePopup(); 
     open = false; 
    } 
} 
@Override 
public boolean onMenuItemSelected(int featureId, MenuItem item) { 
    itemSelected = true; 
    return false; 
} 

在Android 4.0.3上適用於我。顯然onPrepareOptionsMenu在v3之後已經改變了功能。

+0

這就是問題所在。第二次按菜單鍵不會觸發。我試過了,但問題仍然存在。我懷疑我是否理解錯誤。請您澄清一下方法 – darsh 2012-08-14 08:49:35

+0

@darsh - 請檢查編輯後的解決方案。 – cosmincalistru 2012-08-14 09:49:39

1

你爲什麼不這樣做?

private boolean popUpShowed = false; 

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 

    if (keyCode == KeyEvent.KEYCODE_MENU) { 
     if (popUpShowed) { 
      pw.dismiss(); 
      popUpShowed = false; 
     } else if(!popUpShowed){ 
      openpopup(); 
      popUpShowed = true; 
     } 
     return true; 
    } 

    return super.onKeyDown(keyCode, event); 
} 

並刪除彈出窗口上的keyListener。

+0

試過了,仍然沒有工作。我將編輯問題以顯示我用來顯示彈出窗口的方法。 – darsh 2012-08-14 08:41:49

1

試試這個:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 

if (keyCode == KeyEvent.KEYCODE_MENU) { 
    if (pw.isShowing()) { 
     closePW(); 
    } else { 
     openpopup(); // <- I think you do this already here 
    } 
    return true; 
} 

return super.onKeyDown(keyCode, event); 
} 
} 

// Put this function in the class which open the popup 
// like your function openpopup() 
public void closePW(){ 
    pw.dismiss(); 
} 
+0

嘗試,但不幸的是它不工作。我編輯了這個問題,請看看我用來顯示彈出窗口的方法。 – darsh 2012-08-14 08:47:36

+0

請看,請看:http://android-er.blogspot.ch/2012/03/example-of-using-popupwindow.html – 2012-08-14 09:04:02

+0

那麼我唯一的想法是用你的booelan popUpShowed來代替pw.isShowing alexis回答或創建一個funktion public boolean isPopUpShowed(){return popUpShowed;} – 2012-08-14 09:06:03