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);
    }

}

しかし、メニューを押してもポップアップは消えません。

何が問題なのですか?どういうわけかこれを成し遂げる必要があります。私を助けてください。

4

3 に答える 3

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を削除します。

于 2012-08-14T07:00:24.823 に答える
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();
}
于 2012-08-14T07:10:39.080 に答える
1

どうやら、メニューキーを2回押してもトリガーされません。ここで解決策を
見つけました。 それが役に立てば幸い。

編集:
チェックして別のアプローチを作成しました。これはそれを行う必要があります:

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;
}

Android4.0.3で動作します。どうやらonPrepareOptionsMenuv3以降の機能が変更されています。

于 2012-08-14T07:17:48.117 に答える