【问题标题】:how to set an OnTouchListener for a PopupWindow?如何为 PopupWindow 设置 OnTouchListener?
【发布时间】:2013-05-22 13:31:57
【问题描述】:

这是我的代码,它在按钮被触摸时显示一个弹出窗口,当用户松开手指时将其关闭。

但我需要知道用户刚刚松开手指的天气,或者他是否滑入弹出窗口并从那里松开手指。

在我的代码中,这实际上不起作用,因为我猜如果用户不松开手指,弹出窗口就不会获得焦点。有办法解决吗?

谢谢!

    LinearLayout LinLay = new LinearLayout(this);
    ImageView ivg = new ImageView(this);
    ivg.setImageResource(R.drawable.icon);
    LinLay.addView(ivg);
    final PopupWindow pw = new PopupWindow(LinLay, 100, 100, true);

    final Button bt2 = (Button)findViewById(R.id.button2);
    bt2.setOnTouchListener(new OnTouchListener(){
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if(event.getAction() == MotionEvent.ACTION_DOWN )
                {
                pw.showAtLocation(bt2, Gravity.CENTER, 0, 0); 
                }
            else if(event.getAction() == MotionEvent.ACTION_UP )
                {
                pw.dismiss();
                }
            return true;
        }
        });


    ivg.setOnTouchListener(new OnTouchListener(){
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if(event.getAction() == MotionEvent.ACTION_UP )
                {
                showToast(); /// doesn't work! :)
                }
            return true;
        }
        });
    }


public void showToast()
{
    Toast.makeText(this, "AAA!", 500).show();
}

【问题讨论】:

    标签: android


    【解决方案1】:

    使用 imageview 和 imageview onclick() 显示 showpopoup() 窗口

    im = new ImageView(this);
            im.setImageResource(R.drawable.btn);
    
            im.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    showPopup(R.layout.popup_example);
                }
            });
    

    private void showPopup(int resourses) {
    
            final LayoutInflater inflate = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflate.inflate(resourses, null, false);
            ViewGroup viewgroup = (ViewGroup) view
                    .findViewById(R.id.buttonContainer);
            LinearLayout layout = new LinearLayout(this);
    
            view.setOnTouchListener(new OnTouchListener() {
    
                @Override
                public boolean onTouch(View arg0, MotionEvent arg1) {
                    mPopup.dismiss();
                    return true;
                }
            });
    
            mPopup = new PopupWindow(view, 160, LayoutParams.FILL_PARENT, true);
            mPopup.setAnimationStyle(android.R.style.Animation_InputMethod);
            mPopup.showAtLocation(view, Gravity.LEFT, 0, 10);
        }
    

    【讨论】:

    • 感谢您的意见! :) 但问题有点不同,我需要找出用户在弹出窗口内或外面松开手指的天气。当然,我可以使用事件坐标,但只是认为可能有更好的方法。
    【解决方案2】:

    显然,它不起作用。消息发送如下:

    ACTION_DOWN

    1. 活动:调度触摸事件
    2. 活动:onUserInteraction
    3. 布局:调度触摸事件
    4. 布局:onInterceptTouchEvent
    5. 按钮:onTouch(action_down)

    ACTION_UP

    1. 活动:调度触摸事件
    2. 布局:调度触摸事件
    3. 布局:onInterceptTouchEvent
    4. 按钮:ontouch..

    所以你可以看到方法只能转移到向上视图。
    imageview 与按钮处于同一级别..

    【讨论】:

    • 如果您考虑这种情况,它并不明显不起作用。否则不会问这个问题。对你来说显而易见的事情对其他人并不总是显而易见的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    相关资源
    最近更新 更多