Android:Z-Order,带有屏幕范围的Clickblocker-view

时间:2015-12-11 09:39:25

标签: android view click z-order

编辑:已解决。当我将所有自定义视图覆盖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的代码中的任何内容,点击功能也完全停止了。

0 个答案:

没有答案