求助!PopupWindow如何实现点原按钮可以dismiss而点别的按钮可以显示新的Popwindow?

chitoseyono 2018-05-02 06:28:32
我想要实现的是,Activity里有2个Button,点击1个Button会显示出PopupWindow后
如果再点击该Button就会dismiss掉这个PopupWindow,
但如果点击另一个Button不仅dismiss掉这个PopupWindow,并且显示那个Button相应的PopupWindow

我想过的方法:
1.PopupWindow通过setFocusable(true)+setOutsideTouchable(true)来实现第一个效果,但是这样做的话这个PopupWindow获得了焦点后两个Button都没有点击事件了,必须等到前面的PopupWindow被dismiss掉才能继续。
2.通过setFocusable(false),这样Button就都有点击事件了,但是如果点的还是原来的那个Button他不会dismiss掉而是再点开一次,虽然可以通过判断这个PopupWindow有没有显示来进行不同的操作,但是如果这样做Button一多久会很麻烦了,每一个PopupWindow都要判断。

求助大神们有没有更好的解决办法啊...
...全文
693 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jing丶無雙 2018-05-04
  • 打赏
  • 举报
回复
网上看看onTouchEvent的相关文档嘛,这个是很有用处的
chitoseyono 2018-05-03
  • 打赏
  • 举报
回复
用上面所说的第二种方法我也不知道怎么做... 第一次点击Button,popWindow显示出来 如果第二次点击的是原来的Button只要什么都不做就行了,因为点pop以外的地方都会dismiss掉,下一次点击也不会出什么问题,可以再正常显示出pop 但如果第二次点的是Button以外的地方的话虽然同样也引发Dismiss,下一次点击原来的Button时需要的是把popWindow再显示出来 可是想不到怎么区分是连续点两次同一个Button还是第二次点的是Button以外的地方,Button的onClick里也不知道怎么样才能有不同的操作
chitoseyono 2018-05-03
  • 打赏
  • 举报
回复
引用 2 楼 xj396282771 的回复:
代码已整理哈,你可以参考一下。其实并不难,你需要更多的思考
public class MainActivity extends Activity {
	private Button btn1;// 按钮1
	private Button btn2;// 按钮2
	private PopupWindow popOne;
	private PopupWindow popTwo;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		btn1 = (Button) findViewById(R.id.btn1);
		btn2 = (Button) findViewById(R.id.btn2);
		initPopOne();
		initPopTwo();
		btn1.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				if (popOne.isShowing()) {
					popOne.dismiss();
				} else {
					showPopOne(btn1);
				}
				if (popTwo.isShowing()) {
					popTwo.dismiss();
				}
			}
		});
		btn2.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				if (popTwo.isShowing()) {
					popTwo.dismiss();
				} else {
					showPopTwo(btn2);
				}
				if (popOne.isShowing()) {
					popOne.dismiss();
				}
			}
		});
	}

	private void initPopOne() {
		TextView tv = new TextView(this);
		tv.setText("第一个PopupWindow");
		tv.setTextColor(Color.BLUE);
		popOne = new PopupWindow(tv, WindowManager.LayoutParams.WRAP_CONTENT,
				WindowManager.LayoutParams.WRAP_CONTENT);

	}

	private void showPopOne(View view) {
		popOne.showAsDropDown(view, 0, 0);
	}

	private void initPopTwo() {
		TextView tv = new TextView(this);
		tv.setText("第二个PopupWindow");
		tv.setTextColor(Color.BLUE);
		popTwo = new PopupWindow(tv, WindowManager.LayoutParams.WRAP_CONTENT,
				WindowManager.LayoutParams.WRAP_CONTENT);
	}

	private void showPopTwo(View view) {
		popTwo.showAsDropDown(view, 0, 0);
	}
}
这样做我也有想过,但是这样子没有办法实现“点击Button以外的布局能让popWindow dismiss掉”
Jing丶無雙 2018-05-03
  • 打赏
  • 举报
回复
代码已整理哈,你可以参考一下。其实并不难,你需要更多的思考
public class MainActivity extends Activity {
	private Button btn1;// 按钮1
	private Button btn2;// 按钮2
	private PopupWindow popOne;
	private PopupWindow popTwo;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		btn1 = (Button) findViewById(R.id.btn1);
		btn2 = (Button) findViewById(R.id.btn2);
		initPopOne();
		initPopTwo();
		btn1.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				if (popOne.isShowing()) {
					popOne.dismiss();
				} else {
					showPopOne(btn1);
				}
				if (popTwo.isShowing()) {
					popTwo.dismiss();
				}
			}
		});
		btn2.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				if (popTwo.isShowing()) {
					popTwo.dismiss();
				} else {
					showPopTwo(btn2);
				}
				if (popOne.isShowing()) {
					popOne.dismiss();
				}
			}
		});
	}

	private void initPopOne() {
		TextView tv = new TextView(this);
		tv.setText("第一个PopupWindow");
		tv.setTextColor(Color.BLUE);
		popOne = new PopupWindow(tv, WindowManager.LayoutParams.WRAP_CONTENT,
				WindowManager.LayoutParams.WRAP_CONTENT);

	}

	private void showPopOne(View view) {
		popOne.showAsDropDown(view, 0, 0);
	}

	private void initPopTwo() {
		TextView tv = new TextView(this);
		tv.setText("第二个PopupWindow");
		tv.setTextColor(Color.BLUE);
		popTwo = new PopupWindow(tv, WindowManager.LayoutParams.WRAP_CONTENT,
				WindowManager.LayoutParams.WRAP_CONTENT);
	}

	private void showPopTwo(View view) {
		popTwo.showAsDropDown(view, 0, 0);
	}
}
chitoseyono 2018-05-03
  • 打赏
  • 举报
回复
引用 5 楼 xj396282771 的回复:
[quote=引用 4 楼 xj396282771 的回复:] 你直接把代码粘贴复制试试喃,我这边测试到是可以的
这样就可以了重写onTouchEvent事件,刚才的回复看错你的意思了
public class MainActivity extends Activity {
	private Button btn1;// 按钮1
	private Button btn2;// 按钮2
	private PopupWindow popOne;
	private PopupWindow popTwo;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		btn1 = (Button) findViewById(R.id.btn1);
		btn2 = (Button) findViewById(R.id.btn2);
		initPopOne();
		initPopTwo();
		btn1.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				if (popOne.isShowing()) {
					popOne.dismiss();
				} else {
					showPopOne(btn1);
				}
				if (popTwo.isShowing()) {
					popTwo.dismiss();
				}
			}
		});
		btn2.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				if (popTwo.isShowing()) {
					popTwo.dismiss();
				} else {
					showPopTwo(btn2);
				}
				if (popOne.isShowing()) {
					popOne.dismiss();
				}
			}
		});
	}

	private void initPopOne() {
		TextView tv = new TextView(this);
		tv.setText("第一个PopupWindow");
		tv.setTextColor(Color.BLUE);
		popOne = new PopupWindow(tv, WindowManager.LayoutParams.WRAP_CONTENT,
				WindowManager.LayoutParams.WRAP_CONTENT);
		// popOne.setOutsideTouchable(true);

	}

	private void showPopOne(View view) {
		popOne.showAsDropDown(view, 0, 0);
	}

	private void initPopTwo() {
		TextView tv = new TextView(this);
		tv.setText("第二个PopupWindow");
		tv.setTextColor(Color.BLUE);
		popTwo = new PopupWindow(tv, WindowManager.LayoutParams.WRAP_CONTENT,
				WindowManager.LayoutParams.WRAP_CONTENT);
		// popTwo.setOutsideTouchable(true);
	}

	private void showPopTwo(View view) {
		popTwo.showAsDropDown(view, 0, 0);
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		switch (event.getAction()) {
		case MotionEvent.ACTION_UP:
			if (popOne.isShowing()) {
				popOne.dismiss();
			}
			if (popTwo.isShowing()) {
				popTwo.dismiss();
			}
			break;

		default:
			break;
		}
		return true;
	}
}
[/quote] 感谢,我一直不知道有TouchEvent的用法,我还打算给全局的layout加一个clicklistener呢...
Jing丶無雙 2018-05-03
  • 打赏
  • 举报
回复
引用 4 楼 xj396282771 的回复:
你直接把代码粘贴复制试试喃,我这边测试到是可以的
这样就可以了重写onTouchEvent事件,刚才的回复看错你的意思了
public class MainActivity extends Activity {
	private Button btn1;// 按钮1
	private Button btn2;// 按钮2
	private PopupWindow popOne;
	private PopupWindow popTwo;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		btn1 = (Button) findViewById(R.id.btn1);
		btn2 = (Button) findViewById(R.id.btn2);
		initPopOne();
		initPopTwo();
		btn1.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				if (popOne.isShowing()) {
					popOne.dismiss();
				} else {
					showPopOne(btn1);
				}
				if (popTwo.isShowing()) {
					popTwo.dismiss();
				}
			}
		});
		btn2.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				if (popTwo.isShowing()) {
					popTwo.dismiss();
				} else {
					showPopTwo(btn2);
				}
				if (popOne.isShowing()) {
					popOne.dismiss();
				}
			}
		});
	}

	private void initPopOne() {
		TextView tv = new TextView(this);
		tv.setText("第一个PopupWindow");
		tv.setTextColor(Color.BLUE);
		popOne = new PopupWindow(tv, WindowManager.LayoutParams.WRAP_CONTENT,
				WindowManager.LayoutParams.WRAP_CONTENT);
		// popOne.setOutsideTouchable(true);

	}

	private void showPopOne(View view) {
		popOne.showAsDropDown(view, 0, 0);
	}

	private void initPopTwo() {
		TextView tv = new TextView(this);
		tv.setText("第二个PopupWindow");
		tv.setTextColor(Color.BLUE);
		popTwo = new PopupWindow(tv, WindowManager.LayoutParams.WRAP_CONTENT,
				WindowManager.LayoutParams.WRAP_CONTENT);
		// popTwo.setOutsideTouchable(true);
	}

	private void showPopTwo(View view) {
		popTwo.showAsDropDown(view, 0, 0);
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		switch (event.getAction()) {
		case MotionEvent.ACTION_UP:
			if (popOne.isShowing()) {
				popOne.dismiss();
			}
			if (popTwo.isShowing()) {
				popTwo.dismiss();
			}
			break;

		default:
			break;
		}
		return true;
	}
}
Jing丶無雙 2018-05-03
  • 打赏
  • 举报
回复
引用 3 楼 chitoseyono 的回复:
这样做我也有想过,但是这样子没有办法实现“点击Button以外的布局能让popWindow dismiss掉”[/quote] 你直接把代码粘贴复制试试喃,我这边测试到是可以的

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧