2016-07-06 19 views
0

Ich finde es schwierig, ein wahrscheinlich einfaches Feature zu implementieren. Ich habe ein FrameLayout, das ein Dropdown-Menü enthält (wie das in WhatsApp, wenn Sie auf das Symbol Anhang klicken). Ich möchte es schließen, wenn ich außerhalb des FrameLayout klicke.onTouchListener auf FrameLayout: Schließen Sie es, wenn Sie außerhalb klicken

Ich versuche, es mit einem onTouch-Ereignis zu implementieren, ohne Glück.

FrameLayout

Mein Code:

public class MainActivity extends AppCompatActivity { 

private LinearLayout mRevealView; 
private FrameLayout mRevealFrame; 

... 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    ... 

    mRevealView = (LinearLayout) findViewById(R.id.rows); 
    mRevealFrame = (FrameLayout) findViewById(R.id.reveal_frame); 

    ... 

} 

// This method is called when I click on the right menu icon. 
public void fuelTypes() { 
    // Looking for X and Y coordinates. 
    int cx = (mRevealView.getLeft() + mRevealView.getRight()); 
    int cy = (mRevealView.getTop()); 

    // Looking for radius when icon is tapped for showing layout. 
    int startRadius = 0; 
    int endRadius = Math.max(mRevealView.getWidth(), mRevealView.getHeight()); 

    // Performing circular reveal when icon will be tapped. 
    Animator animator = ViewAnimationUtils.createCircularReveal(mRevealView, cx, cy, startRadius, endRadius); 
    animator.setInterpolator(new AccelerateDecelerateInterpolator()); 
    animator.setDuration(400); 

    // Reverse animation to find radius when icon is tapped again for hiding layout. 
    // The starting radius will be the radius or the extent to which circular reveal animation is to be shown. 
    int reverseStartRadius = Math.max(mRevealView.getWidth(), mRevealView.getHeight()); 

    // End - radius will be zero. 
    int reverseEndRadius = 0; 

    // Performing circular reveal for reverse animation. 
    Animator animate = ViewAnimationUtils.createCircularReveal(mRevealView, cx, cy, reverseStartRadius, reverseEndRadius); 

    if (hidden) { 
     // To show the layout when the icon is tapped. 
     mRevealView.setVisibility(View.VISIBLE); 
     mRevealFrame.setVisibility(View.VISIBLE); 
     animator.start(); 
     hidden = false; 
    } else { 
     mRevealView.setVisibility(View.VISIBLE); 
     mRevealFrame.setVisibility(View.VISIBLE); 

     // To hide layout on animation end. 
     animate.addListener(new AnimatorListenerAdapter() { 

      @Override 
      public void onAnimationEnd(Animator animation) { 
       super.onAnimationEnd(animation); 
       mRevealView.setVisibility(View.INVISIBLE); 
       mRevealFrame.setVisibility(View.INVISIBLE); 
       hidden = true; 
      } 

     }); 

     animate.start(); 
    } 

    mRevealFrame.setOnTouchListener(new FrameLayout.OnTouchListener() { 
     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 
      Log.d("MOTION_EVENT", "getAction(): " + motionEvent.getAction()); 

      switch (motionEvent.getAction()) { 

       case MotionEvent.ACTION_UP: 
        Log.d("REVEAL_FRAME", "motion event: " + "ACTION_UP"); 
        fuelTypes(); 
        return true; 

      } 

      return true; 
     } 
    }); 

} 

Die erste Log.d() arbeitet, zeigt, dass der Zuhörer ausgelöst wird. Noch geht die Methode nicht innerhalb der switch: Ich habe schon viele Flaggen, ohne Glück versucht. Ich habe über onInterceptTouchEvent und onTouchEvent gelesen, aber ich weiß nicht, wie man sie anstelle der OnTouchListener verwendet.

Vielen Dank für jede Hilfe.

+0

versuchen zu debuggen Sie programmieren und den Unterschied zwischen MotionEvent.ACTION_CANCEL und Wert innerhalb motionEvent.getAction() –

+0

ACTION_CANCEL sehen hat eine id = 3, während ich nur eine ID für die FrameLayout sehen kann, wenn im Innern klicken davon (normalerweise sind ids gleich 0 und 1). – Davide3i

Antwort

1

Ihr Layout:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:id="@+id/main_layout"  // give id here 
tools:context="com.myfuel.MainActivity"> 

<include layout="@layout/activity_main"/> 

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/reveal_frame" 
    android:layout_marginTop="?attr/actionBarSize"> 

    // EVERYTHING INSIDE THIS WILL BE AS IT IS 

</FrameLayout> 

</FrameLayout> 

Ihre Aktivität

public class MainActivity extends AppCompatActivity { 

private LinearLayout mRevealView; 
private FrameLayout mRevealFrame; 
private FrameLayout mMainLayout; 
... 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    ... 

    mRevealView = (LinearLayout) findViewById(R.id.rows); 
    mRevealFrame = (FrameLayout) findViewById(R.id.reveal_frame); 
    mMainLayout = (FrameLayout) findViewById(R.id.main_layout); 

    mMainLayout.setOnTouchListener(new FrameLayout.OnTouchListener() 
    { 
     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 
      Log.d("MOTION_EVENT", "getAction(): " + motionEvent.getAction()); 

        //Things changed here      

        if(!hidden) 
         fuelTypes(); 


      return false; 
     } 
    }); 
    ... 

} 

Als Ihr mRevealFrame nicht die ganze FrameLayout Ihrer Tätigkeit definieren wir, dass nicht zum Schließen mRevealView verwenden können. Siehe ich habe mMainLayout definiert, die das GANZE Layout abdeckt, wird es jetzt funktionieren.

Versuchen Sie es und lassen Sie mich wissen, wenn es noch ein Problem gibt.

+0

Es scheint mein Problem nicht zu beheben, denn wenn ich außerhalb von FrameLayout klicke, zeigt das Log keine Nachricht an. Jetzt verschwindet mein Menü nur, wenn ich auf das FrameLayout selbst klicke. – Davide3i

+0

1. Wir haben Touch-Listener auf 'mRevealFrame' gesetzt, wenn Sie auf die Seite' mRevealFrame' klicken, offensichtlich wird kein Log erzeugt. 2. ** Jetzt verschwindet mein Menü nur, wenn ich auf das FrameLayout selbst klicke ** Für diesen Sinn muss ich Ihre ganze Anforderung verstehen, nicht nur den 'touchListner'. –

+0

Ich werde die Antwort mit einem Bild aktualisieren. Ich werde versuchen, mein Ziel erneut zu erklären: Schließen des WhatsApp-ähnlichen Dropdown-Menüs, wenn ich außerhalb des FrameLayout klicke, enthalten es (= Klicken an jeder anderen Stelle meiner Aktivität). Vielen Dank für Ihre Hilfe. – Davide3i