2014-08-31 2 views
3

это мой макет:Проверить нажмите снаружи View

<?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> 

Я поставил onclicklistener на родитель и ребенок зрение:

linearLayout.setOnClickListener(myOnlyhandler); 
videoView.setOnClickListener(myOnlyhandler); 

Я получаю только событие нажатия для просмотра видео. Я хочу знать, нажимает ли пользователь на просмотр видео или снаружи (родительский) и выполняет разные действия. Как мне получить это поведение?

Благодаря Tata

+0

Пожалуйста, покажите свой код myOnlyhandler. –

+0

вы получаете сообщение о событии видеовидео, даже если вы нажмете его? – suitianshi

ответ

8

Некоторое время назад я реализовал Activity базовый класс, который предлагает такую ​​функциональность. Вы просто регистрируете пользовательский OnTouchOutsideViewListener, который получает уведомление после того, как пользователь коснется внешнего вида после установки прослушивателя. Просто позвоните 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); 
}  

} 
+0

Хороший ответ в целом. Вам может потребоваться, чтобы dispatchTouchEvent() вернул true, если касание было вне представления, так что событие касания потребляется. Кроме того, чаще всего срабатывает MotionEvent.ACTION_UP. – Rasmusob