Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 选中“在视图外单击”_Android_Layout - Fatal编程技术网

Android 选中“在视图外单击”

Android 选中“在视图外单击”,android,layout,Android,Layout,这是我的布局: <?xml version="1.0" encoding="utf-8"?><!-- Style Theme.Transparent --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/linearLayoutVideo" android:layout_width="match_parent"

这是我的布局:

<?xml version="1.0" encoding="utf-8"?><!-- Style Theme.Transparent -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/linearLayoutVideo"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:weightSum="1"
    android:focusable="true"
    android:clickable="true">

    <VideoView
        android:id="@+id/videoView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.75"
        android:clickable="true"
        android:focusable="true" />

</LinearLayout>
我只获得视频查看的点击事件。 我想知道的是,用户是点击视频视图还是点击外部(家长)并执行不同的操作。我如何获得这种行为

谢谢
Tata

不久前,我实现了一个提供此类功能的
活动
基类。您只需在OutsideViewListener上注册一个自定义
,一旦用户在安装了监听器后接触到您的视图之外,就会收到通知。只需在活动实例上调用
setOnTouchOutsideViewListener

您可以将此代码粘贴到现有的活动类中,或者创建一个可以在整个项目中重用的基本活动类

class YourActivity extends Activity {

private View mTouchOutsideView;

private OnTouchOutsideViewListener mOnTouchOutsideViewListener;

/**
 * Sets a listener that is being notified when the user has tapped outside a given view. To remove the listener,
 * call {@link #removeOnTouchOutsideViewListener()}.
 * <p/>
 * This is useful in scenarios where a view is in edit mode and when the user taps outside the edit mode shall be
 * stopped.
 *
 * @param view
 * @param onTouchOutsideViewListener
 */
public void setOnTouchOutsideViewListener(View view, OnTouchOutsideViewListener onTouchOutsideViewListener) {
    mTouchOutsideView = view;
    mOnTouchOutsideViewListener = onTouchOutsideViewListener;
}

public OnTouchOutsideViewListener getOnTouchOutsideViewListener() {
    return mOnTouchOutsideViewListener;
}

@Override
public boolean dispatchTouchEvent(final MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
        // Notify touch outside listener if user tapped outside a given view
        if (mOnTouchOutsideViewListener != null && mTouchOutsideView != null
            && mTouchOutsideView.getVisibility() == View.VISIBLE) {
            Rect viewRect = new Rect();
            mTouchOutsideView.getGlobalVisibleRect(viewRect);
            if (!viewRect.contains((int) ev.getRawX(), (int) ev.getRawY())) {
                mOnTouchOutsideViewListener.onTouchOutside(mTouchOutsideView, ev);
            }
        }
    }
    return super.dispatchTouchEvent(ev);
}

/**
 * Interface definition for a callback to be invoked when a touch event has occurred outside a formerly specified
 * view. See {@link #setOnTouchOutsideViewListener(View, OnTouchOutsideViewListener).}
 */
public interface OnTouchOutsideViewListener {

    /**
     * Called when a touch event has occurred outside a given view.
     *
     * @param view  The view that has not been touched.
     * @param event The MotionEvent object containing full information about the event.
     */
    public void onTouchOutside(View view, MotionEvent event);
}    

}
class YourActivity扩展活动{
私有视图mTouchOutsideView;
私有OnTouchOutsideViewListener mOnTouchOutsideViewListener;
/**
*设置一个侦听器,当用户在给定视图外点击时,该侦听器将收到通知。若要删除该侦听器,
*调用{@link#removeOnTouchOutsideViewListener()}。
*

*这在视图处于编辑模式的情况下非常有用,并且当用户点击编辑模式之外的位置时,应 *停下来。 * *@param视图 *@param onTouchOutsideViewListener */ public void setOnTouchOutsideViewListener(视图视图,OnTouchOutsideViewListener OnTouchOutsideViewListener){ mTouchOutsideView=视图; mOnTouchOutsideViewListener=onTouchOutsideViewListener; } 公共OnTouchOutsideViewListener getOnTouchOutsideViewListener(){ 返回mOnTouchOutsideViewListener; } @凌驾 公共布尔dispatchTouchEvent(最终运动事件ev){ if(ev.getAction()==MotionEvent.ACTION\u向下){ //如果用户在给定视图外点击,则通知触摸外部侦听器 如果(mOnTouchOutsideViewListener!=null&&mTouchOutsideView!=null &&mTouchOutsideView.getVisibility()==View.VISIBLE){ Rect viewRect=新的Rect(); mTouchOutsideView.getGlobalVisibleRect(viewRect); 如果(!viewRect.contains((int)ev.getRawX(),(int)ev.getRawY()){ OnTouchOut(mTouchOutsideView,ev); } } } 返回超级dispatchTouchEvent(ev); } /** *当触摸事件发生在以前指定的外部时调用的回调的接口定义 *视图。请参见{@link#setOnTouchOutsideViewListener(视图,OnTouchOutsideViewListener)。} */ OutsideViewListener上的公共接口{ /** *在给定视图外部发生触摸事件时调用。 * *@param view未触及的视图。 *@param event包含事件完整信息的MotionEvent对象。 */ 外部公共空间(视图、运动事件); } }


请显示您的myOnlyhandler代码。即使您在videoView之外单击,也会获得videoView的单击事件?总体回答不错。如果触摸在视图之外,您可能希望dispatchTouchEvent()返回true,以便使用触摸事件。此外,在MotionEvent.ACTION\u UP上触发更为常见。
class YourActivity extends Activity {

private View mTouchOutsideView;

private OnTouchOutsideViewListener mOnTouchOutsideViewListener;

/**
 * Sets a listener that is being notified when the user has tapped outside a given view. To remove the listener,
 * call {@link #removeOnTouchOutsideViewListener()}.
 * <p/>
 * This is useful in scenarios where a view is in edit mode and when the user taps outside the edit mode shall be
 * stopped.
 *
 * @param view
 * @param onTouchOutsideViewListener
 */
public void setOnTouchOutsideViewListener(View view, OnTouchOutsideViewListener onTouchOutsideViewListener) {
    mTouchOutsideView = view;
    mOnTouchOutsideViewListener = onTouchOutsideViewListener;
}

public OnTouchOutsideViewListener getOnTouchOutsideViewListener() {
    return mOnTouchOutsideViewListener;
}

@Override
public boolean dispatchTouchEvent(final MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
        // Notify touch outside listener if user tapped outside a given view
        if (mOnTouchOutsideViewListener != null && mTouchOutsideView != null
            && mTouchOutsideView.getVisibility() == View.VISIBLE) {
            Rect viewRect = new Rect();
            mTouchOutsideView.getGlobalVisibleRect(viewRect);
            if (!viewRect.contains((int) ev.getRawX(), (int) ev.getRawY())) {
                mOnTouchOutsideViewListener.onTouchOutside(mTouchOutsideView, ev);
            }
        }
    }
    return super.dispatchTouchEvent(ev);
}

/**
 * Interface definition for a callback to be invoked when a touch event has occurred outside a formerly specified
 * view. See {@link #setOnTouchOutsideViewListener(View, OnTouchOutsideViewListener).}
 */
public interface OnTouchOutsideViewListener {

    /**
     * Called when a touch event has occurred outside a given view.
     *
     * @param view  The view that has not been touched.
     * @param event The MotionEvent object containing full information about the event.
     */
    public void onTouchOutside(View view, MotionEvent event);
}    

}