Android 关闭弹出窗口而不单击按钮

Android 关闭弹出窗口而不单击按钮,android,popupwindow,Android,Popupwindow,我不想在Android中关闭弹出窗口的按钮。我只需按下屏幕,弹出窗口就会关闭。它只工作按钮点击,如果我点击关闭按钮,然后它关闭,但我不想在我的弹出窗口中的任何按钮,我只想点击屏幕上的任何地方,然后它应该关闭 MainActivity.java: import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.view.LayoutInflater; impo

我不想在Android中关闭弹出窗口的按钮。我只需按下屏幕,弹出窗口就会关闭。它只工作按钮点击,如果我点击关闭按钮,然后它关闭,但我不想在我的弹出窗口中的任何按钮,我只想点击屏幕上的任何地方,然后它应该关闭

MainActivity.java:

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.PopupWindow;
import android.widget.Toast;

public class MainActivity extends Activity {

private Button btn1, btn2;
private QuickAction quick;
private PopupWindow window;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btn1 = (Button) findViewById(R.id.button1);
    btn2 = (Button) findViewById(R.id.button2);
    btn1.setOnClickListener(btn1_Click);
    btn2.setOnClickListener(btn2_Click);
    ActionItem itm1 = new ActionItem(1, "Item1", null);
    ActionItem itm2 = new ActionItem(2, "Item2", null);
    quick = new QuickAction(this, QuickAction.VERTICAL);
    quick.addActionItem(itm1);
    quick.addActionItem(itm2);
    quick.setOnActionItemClickListener(quick_Clicked);
}

private OnClickListener btn1_Click = new OnClickListener() {

    @Override
    public void onClick(View v) {
        quick.show(v);
    }

};

private OnClickListener btn2_Click = new OnClickListener() {

    @Override
    public void onClick(View v) {
         LayoutInflater inflater = (LayoutInflater) MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
          View layout = inflater.inflate(R.layout.popup, null);
          window = new PopupWindow(layout, 500, 400, true);
          window.showAtLocation(layout,17, 0, 0);
          Button btn = (Button) layout.findViewById(R.id.buttonclose);
          btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                window.dismiss();
            }

          });
    }


};

private QuickAction.OnActionItemClickListener quick_Clicked = new QuickAction.OnActionItemClickListener() {

    @Override
    public void onItemClick(QuickAction source, int pos, int actionId) {
        if (actionId == 1) {
            Toast.makeText(MainActivity.this, "Item 1 was clicked", Toast.LENGTH_LONG).show();
        } else if (actionId == 2) {
            Toast.makeText(MainActivity.this, "Item 2 was clicked", Toast.LENGTH_LONG).show();
        }
    }
};
}
这是我的弹出窗口。什么样的改变对我来说就足够了。我应该换一节课吗

public class PopupWindows {
protected Context mContext;
public PopupWindow mWindow;
protected View mRootView;
protected Drawable mBackground = null;
protected WindowManager mWindowManager;

/**
 * Constructor.
 * 
 * @param context Context
 */
public PopupWindows(Context context) {
    mContext    = context;
    mWindow     = new PopupWindow(context);
    mWindow.setBackgroundDrawable(new BitmapDrawable());
    mWindow.setTouchInterceptor(new OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
                mWindow.dismiss();

                return true;
            }

            return false;
        }
    });

    mWindowManager = (WindowManager)     context.getSystemService(Context.WINDOW_SERVICE);
}

/**
 * On dismiss
 */
protected void onDismiss() {        
}

/**
 * On show
 */
protected void onShow() {       
}


/**
 * On pre show
 */
protected void preShow() {
    if (mRootView == null) 
        throw new IllegalStateException("setContentView was not called with a view to display.");

    onShow();

//  if (mBackground == null) 
//      mWindow.setBackgroundDrawable(new BitmapDrawable());
//else 
//      mWindow.setBackgroundDrawable(new BitmapDrawable());

    mWindow.setWidth(WindowManager.LayoutParams.WRAP_CONTENT);
    mWindow.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
    //      mWindow.setTouchable(true);
//  mWindow.setFocusable(true);
//  mWindow.setOutsideTouchable(true);

    mWindow.setContentView(mRootView);
}

/**
 * Set background drawable.
 * 
 * @param background Background drawable
 */
public void setBackgroundDrawable(Drawable background) {
    mWindow.setBackgroundDrawable(background);
}

/**
 * Set content view.
 * 
 * @param root Root view
 */
public void setContentView(View root) {
    mRootView = root;

    mWindow.setContentView(root);
}

/**
 * Set content view.
 * 
 * @param layoutResID Resource id
 */
public void setContentView(int layoutResID) {
    LayoutInflater inflator = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    setContentView(inflator.inflate(layoutResID, null));
}

/**
 * Set listener on window dismissed.
 * 
 * @param listener
 */
public void setOnDismissListener(PopupWindow.OnDismissListener listener) {
    mWindow.setOnDismissListener(listener);  
}

/**
 * Dismiss the popup window.
 */
public void dismiss() {
    mWindow.dismiss();
}
Popup.xml:

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.PopupWindow;
import android.widget.Toast;

public class MainActivity extends Activity {

private Button btn1, btn2;
private QuickAction quick;
private PopupWindow window;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btn1 = (Button) findViewById(R.id.button1);
    btn2 = (Button) findViewById(R.id.button2);
    btn1.setOnClickListener(btn1_Click);
    btn2.setOnClickListener(btn2_Click);
    ActionItem itm1 = new ActionItem(1, "Item1", null);
    ActionItem itm2 = new ActionItem(2, "Item2", null);
    quick = new QuickAction(this, QuickAction.VERTICAL);
    quick.addActionItem(itm1);
    quick.addActionItem(itm2);
    quick.setOnActionItemClickListener(quick_Clicked);
}

private OnClickListener btn1_Click = new OnClickListener() {

    @Override
    public void onClick(View v) {
        quick.show(v);
    }

};

private OnClickListener btn2_Click = new OnClickListener() {

    @Override
    public void onClick(View v) {
         LayoutInflater inflater = (LayoutInflater) MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
          View layout = inflater.inflate(R.layout.popup, null);
          window = new PopupWindow(layout, 500, 400, true);
          window.showAtLocation(layout,17, 0, 0);
          Button btn = (Button) layout.findViewById(R.id.buttonclose);
          btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                window.dismiss();
            }

          });
    }


};

private QuickAction.OnActionItemClickListener quick_Clicked = new QuickAction.OnActionItemClickListener() {

    @Override
    public void onItemClick(QuickAction source, int pos, int actionId) {
        if (actionId == 1) {
            Toast.makeText(MainActivity.this, "Item 1 was clicked", Toast.LENGTH_LONG).show();
        } else if (actionId == 2) {
            Toast.makeText(MainActivity.this, "Item 2 was clicked", Toast.LENGTH_LONG).show();
        }
    }
};
}
看起来没问题,我会删除关闭按钮。如果在没有关闭按钮的情况下成功关闭我的弹出窗口


布努窗口。显示位于Altina koy的位置

private OnClickListener btn2_Click = new OnClickListener() {

    @Override
    public void onClick(View v) {
         LayoutInflater inflater = (LayoutInflater) MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
          View layout = inflater.inflate(R.layout.popup, null);
          window = new PopupWindow(layout, 500, 400, true);

         // window.setTouchable(true);
         // window.setOutsideTouchable(true);
          window.setBackgroundDrawable (new BitmapDrawable());
         // window.setFocusable(false);
          window.setOutsideTouchable(true); 
          window.setTouchInterceptor(new OnTouchListener() {
              public boolean onTouch(View v, MotionEvent event) {
                  if (event.getAction() == MotionEvent.ACTION_DOWN) {
                      window.dismiss(); 
                      return true;
                      }
                  return false; 
                  } 
              }); 
          window.showAtLocation(layout,17, 0, 0);

          Button btn = (Button) layout.findViewById(R.id.buttonclose);
          btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                window.dismiss();
            }

          });

    }


};

Altina koy中的BUNU window.showAtLocation。

接受的答案实际上引入了一个bug,如果弹出窗口有列表视图,它会拦截您的单击侦听器。这意味着单击listview/expandablelistview将关闭该对话框。实际上,您不需要设置触摸拦截器

private OnClickListener btn2_Click = new OnClickListener() {

    @Override
    public void onClick(View v) {
         LayoutInflater inflater = (LayoutInflater) MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
          View layout = inflater.inflate(R.layout.popup, null);
          window = new PopupWindow(layout, 500, 400, true);

         // window.setTouchable(true);
         // window.setOutsideTouchable(true);
          window.setBackgroundDrawable (new BitmapDrawable());
         // window.setFocusable(false);
          window.setOutsideTouchable(true); 
          window.setTouchInterceptor(new OnTouchListener() {
              public boolean onTouch(View v, MotionEvent event) {
                  if (event.getAction() == MotionEvent.ACTION_DOWN) {
                      window.dismiss(); 
                      return true;
                      }
                  return false; 
                  } 
              }); 
          window.showAtLocation(layout,17, 0, 0);

          Button btn = (Button) layout.findViewById(R.id.buttonclose);
          btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                window.dismiss();
            }

          });

    }


};
因此,代码片段如下所示:

window.setBackgroundDrawable(new BitmapDrawable());
window.setOutsideTouchable(true); 
就这样

如果您仍然希望拦截触摸(没有理由),则应执行以下操作:

window.setTouchInterceptor(new OnTouchListener() { 
    public boolean onTouch(View view, MotionEvent event) { 
       if (event.getAction() == MotionEvent.ACTION_DOWN) {
          window.dismiss();
          boolean consumedEvent = true;
          if (view.hasOnClickListeners()) {
              consumedEvent = view.onTouchEvent(event);
          } 
        return consumedEvent; 
    } 
    return false;    
  } 
}); 

接受的答案实际上引入了一个bug,如果弹出窗口有列表视图,它会拦截您的单击侦听器。这意味着单击listview/expandablelistview将关闭该对话框。实际上,您不需要设置触摸拦截器

因此,代码片段如下所示:

window.setBackgroundDrawable(new BitmapDrawable());
window.setOutsideTouchable(true); 
就这样

如果您仍然希望拦截触摸(没有理由),则应执行以下操作:

window.setTouchInterceptor(new OnTouchListener() { 
    public boolean onTouch(View view, MotionEvent event) { 
       if (event.getAction() == MotionEvent.ACTION_DOWN) {
          window.dismiss();
          boolean consumedEvent = true;
          if (view.hasOnClickListeners()) {
              consumedEvent = view.onTouchEvent(event);
          } 
        return consumedEvent; 
    } 
    return false;    
  } 
}); 

如果您正在寻找一种在特定持续时间后自动关闭弹出窗口的方法,我在以下线程中发布了一种方法:如果您正在寻找一种在特定持续时间后自动关闭弹出窗口的方法,我在以下线程中发布了一种方法: