5

ボタンをクリックすると表示されるポップアップメニューを実装しました。これは私のonclickメソッドです。

public void showOverflow(View view) {

    boolean click = true;
    Button action = (Button) findViewById(R.id.btbAction);

    LayoutInflater inflater = (LayoutInflater) main.this
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View popupView = inflater.inflate(R.layout.overflow_layout, null);
    final PopupWindow pw = new PopupWindow(popupView,
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    pw.setOutsideTouchable(true);
    if (click) {
        pw.showAsDropDown(action, 0, 0);
        click = false;
    } else {
        pw.dismiss();
        click = true;
    }
}

ボタンがクリックされると、ポップアップウィンドウが表示されます。ここで、問題は、ポップアップウィンドウの外側をタッチしてもウィンドウが閉じられないことです。このプロパティをポップアップウィンドウに設定してみました

pw.setOutsideTouchable(true);

物事は同じままです。これを修正するのを手伝ってください

4

3 に答える 3

5

setOutsideTouchable呼び出しのパラメータをtrue次 のように変更する必要があります。pw.setOutsideTouchable(false);

ポップアップにウィンドウ外のタッチイベントを通知するかどうかを制御します。これは、タッチ可能であるがフォーカス可能ではないポップアップに対してのみ意味があります。つまり、ウィンドウの外側のタッチは、背後のウィンドウに配信されます。デフォルトはfalseです。

ポップアップが表示されている場合、このメソッドの呼び出しは、次にポップアップが表示されたとき、またはupdate()メソッドの1つを手動で呼び出したときにのみ有効になります。

パラメータ:ポップアップが外部タッチイベントを受信する必要がある場合はtouchable true 、それ以外の場合はfalse

一方、clickローカル変数は何をすることになっていますか?これはtrueに設定されているため、メソッドが呼び出されるたびに常に強制的pwにポップアップします。メソッドを終了するとライフサイクルが終了するため、後でfalseに設定されます。showOverflow

コードは次のようになります。

private LayoutInflater inflater;
private Button action;
private PopupWindow pw;
private View popupView;
/*
 * (non-Javadoc)
 * @see android.app.Activity#onCreate(android.os.Bundle)
 */
@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash);
    inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    popupView = inflater.inflate(R.layout.overflow_layout, null, false);

    action = (Button) findViewById(R.id.action);
    action.setOnClickListener(this);
}

public void showOverflow()
{
    pw = new PopupWindow(getApplicationContext());
    pw.setWidth(WindowManager.LayoutParams.WRAP_CONTENT);
    pw.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
    pw.setOutsideTouchable(true);

    pw.setContentView(popupView);
    pw.showAsDropDown(action, 0, 0);
}

クラス内にいるgetApplicationContext()場合に使用する必要があります。Activityそれ以外の場合はContext、をパラメータとして取得する必要があります。

于 2012-05-14T05:11:40.540 に答える
0

pw.setOutsideTouchable(true);に変更pw.setOutsideTouchable(false);

于 2015-03-13T02:51:19.480 に答える
0

私はこれが古い質問であることを知っていますが、これは私がそれを修正するためにしたことです

問題は:

showOverFlow()を呼び出すたびに、popupwindowの新しいインスタンスを作成しているため、popupwindowを閉じた後、別のポップアップウィンドウが表示されます。

あなたは何をしますかでpopupviewを初期化しますOnCreate

次にpopupwindow.showAsDropDown(view)showOverFlow()メソッドを呼び出します

そして最後に、以下のコードが表示されているかどうかを確認できます

このコードをボタンonclickに入れてください

  if(popupwindow.isShowing()){
  popup.dismiss() }
  else{
  ShowOverflow()}
于 2021-09-02T14:43:21.757 に答える