2012-11-21 8 views
5

Ich habe Frame-Layout:Pass Click-Ereignis durch die Ansicht android

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_margin="10dp" > 

<LinearLayout 
    android:id="@+id/widgetView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center" 
    android:layout_margin="10dp" 
    android:gravity="center" > 
</LinearLayout> 

<LinearLayout 
    android:id="@+id/widgetOverlayFrame" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:clickable="false" > 
</LinearLayout> 

Erstes Layout-Widget Layout enthält, und das zweite ist transparent und erhält onLongClick method.That Arbeiten für das Ziehen, das Problem ist, Wenn ich mit Widget interagieren möchte, klicken Sie auf etwas, klicken Sie auf Ereignis wird von OverlayFrame übernommen. Wie kann ich Click Event über OverlayFrame an WidgetView übergeben?

EDIT:

Jetzt versuche ich GestureLister zu overlayFrame Linearlayout, befestigen Unterschied zwischen Motion irgendwie zu sehen, dem einzigen Klick und langen Klick darstellen. Das Problem, mit dem ich konfrontiert bin, ist, dass OnLongPress im Gesten-Listener immer aufgerufen wird, was auch immer ich tue, einzelner Klick oder langer Klick.

Gibt es eine Erklärung für dieses Verhalten? Tnx!

Antwort

0

Statt GestureListener verwenden Sie die onTouchListener auf diese Weise außer Kraft setzen können.

Dies wird Longpress aufrufen, wenn die Zeit abgelaufen ist und wenn ein bis dazwischen kommt, wird es die Longpress

CountDownTimer c; 
    long time=5000; 
    @Override 
    public boolean onTouchEvent(MotionEvent ev) { 
     switch (ev.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       c= new CountDownTimer(5000, 1000) { 
          public void onTick(long millisUntilFinished) { 
            time=millisUntilFinished; 
          } 

          public void onFinish() { 
           Log.i("","LONG PRESS"); 
          }}.start(); 

      break; 
      case MotionEvent.ACTION_UP: 
       if (time>0) { 
        Log.i("example","short click"); 
        c.cancel(); 
       } 
      break; 
     } 

     return true; 
    } 
+0

Ok, das funktioniert für Erkennung perfekt ... Wie übertrage ich jetzt Click-to-Layer unter? – Veljko

+0

Ich habe das funktioniert etwas wie ... tnx für die Idee! – Veljko

0

Vielleicht würde die Einstellung der Überlagerung Attribut android:focusable="false" oder android:focusableInTouchMode="false" würde ausreichen.

Sie können auch Ihr eigenes Overlay-Widget erstellen und die onInterceptTouchEvent-Methode überschreiben, um immer false zurückzugeben.

public class NotTouchableLinearLayout extends LinearLayout { 

    // Override constructors 
    // ... 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     return false; 
    } 
} 
+0

ich beide versucht haben, bisher nichts gearbeitet. Irgendeine andere Idee? – Veljko

+0

Versuchen Sie, onTouch anstelle von onInterceptTouchEvent zu überschreiben. –

+0

hehe, ich habe das getan, aber jetzt onLongClick on overlayLayout wird nicht aufgerufen. Und ich kann keine Gegenstände ziehen. – Veljko

0

Statt ein GestureListener auf dem oberen Layout einstellen, sollten Sie Ihre eigene Klasse erstellen, die LinearLayout und außer Kraft zu setzen reicht es onTouchEvent Methode. Es Ihnen die Logik von langen Klick usw. \ kurzen implementieren können klicken

Die Click-Ereignisse zuerst auf das Widget-Layout gesendet werden, und nur dann, wenn sie nicht mit ihnen umgehen sind (daher ist es onTouchEvent kehrt false), werden Sie Holen Sie sie auf das oberste Layout.

edit:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_margin="10dp" > 

<LinearLayout 
android:id="@+id/widgetView" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_gravity="center" 
android:layout_margin="10dp" 
android:gravity="center" > 
</LinearLayout> 

<com.example.touchtesting.MyLinearLayout 
android:id="@+id/widgetOverlayFrame" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:clickable="false" > 
</com.example.touchtesting.MyLinearLayout> 

</FrameLayout> 

Änderung der com.example.touchtesting auf den Namen Ihres Pakets. und das ist die Klasse:

 public class MyLinearLayout extends LinearLayout{ 

     public MyLinearLayout(Context context, AttributeSet attrs) { 
      super(context, attrs); 
     } 

     private long startClick = 0; 

     @Override 
     public boolean onTouchEvent(MotionEvent ev) { 
      switch (ev.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        startClick = ev.getEventTime(); 
        break; 
       case MotionEvent.ACTION_CANCEL: 
       case MotionEvent.ACTION_UP: 
        if (ev.getEventTime() - startClick < 500) { 
         Log.i("example","short click"); 
        } 
        else { 
         Log.i("example","long click"); 
        } 
        break; 
      } 

      return true; 
     } 

    } 
+0

könnten Sie einen Code bereitstellen? – Veljko

+0

bearbeitet die Antwort – Rotem

+0

ich werde das jetzt versuchen;) tnx ... es macht Sinn ... hoffe, das funktioniert ... ich habe ein paar Tage damit verloren. – Veljko

0

abbrechen Um die langen Klicks durch die widgetView passieren zu bekommen LinearLayoutandroid:longClickable="true" hinzuzufügen. (Für gewöhnliche Klicks hinzufügen android:clickable="true")

So widgetView wird:

<LinearLayout 
    android:id="@+id/widgetView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center" 
    android:layout_margin="10dp" 
    android:gravity="center" 
    android:longClickable="true"> 
</LinearLayout>