编辑:已解决。当我将所有自定义视图覆盖Button而不是View时,问题就消失了。
我尝试以编程方式创建一个屏幕大小的不可见视图,该视图应捕获所有点击事件,从而阻止所有底层元素。但我遇到了一些麻烦。
预期目标是当用户点击某个按钮时,会创建一个菜单。此菜单启动时,页面上的其他按钮不再起作用。点击菜单应该会发生一些事情,点击其他任何地方都会使菜单消失并让其他元素再次运行。
我设法创建了屏幕宽视图,并且每当用户点击一个尚未被按钮覆盖的点时,它就会捕获点击并销毁菜单。当用户点击包含按钮的位置时,仅处理按钮的onclickevent,而不是我的clickblocker的处理。它应该是相反的方式。 这让我认为它是一个z阶问题(但不是100%肯定)。 不幸的是,我试图定位那些不支持view.setZ()的旧版本,而view.bringToFront()似乎并没有按照我的意愿去做。
这里是viewblocker的代码:
public class ClickBlockerView extends View{
public ClickBlockerView(Context context) {
super(context);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(C.GetWindowWidth(getContext()), C.GetWindowHeight(getContext()));
}
public static ClickBlockerView CreateClickBlocker(Context context){
ClickBlockerView c = new ClickBlockerView(context);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
c.setLayoutParams(params);
c.setId(R.id.clickBlocker);
c.setClickable(true);
return c;
}
}
这就是我调用它的方式(来自另一个视图):
private void createMenuAndClickblocker(){
ClickBlockerView clickblocker = ClickBlockerView.CreateClickBlocker(getContext());
clickblocker.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
destroyMenu();
}
});
((RelativeLayout) this.getParent()).addView(clickblocker);
clickblocker.bringToFront();
createMenu();
requestLayout();
}
有没有人知道如何解决这个问题?其他解决方案也是受欢迎的。我不想使用xml(它必须添加到每个活动中)
更新:
显然,z-ordering适用于微调器和复选框,但不适用于按钮和我的自定义视图。奇...
更新2:
绘制时,显示的形状可以正确填满屏幕,但它也会在其他自定义视图下方绘制,即使它稍后创建并显示在前面。 奇怪的是,即使我没有更改此clickblocker的代码中的任何内容,点击功能也完全停止了。