Android 关闭弹出窗口而不单击按钮
我不想在Android中关闭弹出窗口的按钮。我只需按下屏幕,弹出窗口就会关闭。它只工作按钮点击,如果我点击关闭按钮,然后它关闭,但我不想在我的弹出窗口中的任何按钮,我只想点击屏幕上的任何地方,然后它应该关闭 MainActivity.java: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
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;
}
});
如果您正在寻找一种在特定持续时间后自动关闭弹出窗口的方法,我在以下线程中发布了一种方法:如果您正在寻找一种在特定持续时间后自动关闭弹出窗口的方法,我在以下线程中发布了一种方法: