问题


最近在尝试做 Android 自动化的时候,发现 popupwindow 按钮识别不到。类似于这里写图片描述,UiAutomator 仍然识别的是下一层的窗体,前段时间在论坛也看到有人提出这个问题过,所以专门写个帖子分享下。可能这个时候有些人就开始想,工具都识别不出来。看来这个就是注定搞不了。 实际上我们应该尝试的去分析下原因

分析


刚才前面说了,UiAutomator 仍然识别的是下一层的窗体 很有可能的原因是焦点仍然处于下一层窗体的原因,带着这个问题我们自己来写个 popupwindow 的一个 demo 来验证这个问题就可以了。

这里就直接贴出 popupwindow 的代码(网上搜很多)。

// 一个自定义的布局,作为显示的内容
        View contentView = LayoutInflater.from(mContext).inflate(
                R.layout.pop_window, null);
        // 设置按钮的点击事件
        Button button = (Button) contentView.findViewById(R.id.button1);
        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Toast.makeText(mContext, "button is pressed",
                        Toast.LENGTH_SHORT).show();
            }
        });

        final PopupWindow popupWindow = new PopupWindow(contentView,
                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);

        popupWindow.setTouchable(true);

        popupWindow.setTouchInterceptor(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                Log.i("mengdd", "onTouch : ");

                return false;
                // 这里如果返回true的话,touch事件将被拦截
                // 拦截后 PopupWindow的onTouchEvent不被调用,这样点击外部区域无法dismiss
            }
        });

        popupWindow.setBackgroundDrawable(getResources().getDrawable(
                R.drawable.logo));

        // 设置好参数之后再show
        popupWindow.showAsDropDown(view);

上面的实现只是做到通过点击一个按钮后,弹出一个 pipwindow,我们来试试用 Uiautomator 来识别下。

这里写图片描述

确实是识别不出来。那下来我们在 contentView 后面加一句,让 contenview 处于焦点

View contentView = LayoutInflater.from(mContext).inflate(
                R.layout.pop_window, null);
contentView.setFocusable(true);

运行程序,再来尝试下识别看看。

这里写图片描述

好了识别成功了,说明就是一个焦点的问题导致的。所以只要让开发哥哥们加上刚才前面那句代码就可以了。

参考


浮层定位不到问题 这篇文章实际已经给出了答案,只是估计很少了回去看后面的回复。


↙↙↙阅读原文可查看相关链接,并与作者交流