2016-02-12 19 views
12

स्नैकबार दिखाने के लिए नीचे सरल कोड। जब onClick घटना होती हैस्नैकबार को खारिज करें बाएं स्वाइप पर

public void onClick(View view) { 
     Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_INDEFINITE) 
       .setAction("Action", null).show(); 
} 

इस कोड को सही ढंग से Snackbar, पता चलता है।

इसके अलावा, इस स्नैकबार को स्वाइप इशारा द्वारा खारिज कर दिया जा सकता है।

लेकिन डिफ़ॉल्ट रूप से, केवल दाएं स्वाइप स्नैकबार को खारिज कर रहा है। और मैं बाएं स्वाइप के साथ इसे खारिज करने में असमर्थ हूं।

पर स्नैकबार को कैसे खारिज करें?

+0

आप इस के लिए एक समाधान मिला? –

+0

@JakubHolovsky संख्या जैसा कि आप देख सकते हैं, इस पोस्ट के नीचे कोई जवाब पोस्ट नहीं किया गया है। और यह लगभग 6 महीने पुराना है ... इसलिए मैं इस समय एक मंच सीमा के रूप में इसे मान रहा हूं। – AADProgramming

+1

** स्नैकबार ** को ** कोऑर्डिनेटर लेआउट ** की आवश्यकता है क्योंकि इसके मूल लेआउट या इसके शीर्ष पर, इसके विभिन्न ऑपरेशंस जैसे ** ** को खारिज करने के लिए स्वाइप करें। आपको एक समान प्रश्न मिल सकता है [यहां] (http://stackoverflow.com/questions/38823767/snackbar-is-not-dismissing-on-swipe) – Bee

उत्तर

4

पर यह snackBar खारिज करेगा वाम पर स्वाइप (लेकिन पर कि एनीमेशन के बिना बाएं स्वाइप करें)

  • उपयोग getView() और snackBar लेआउट
  • उपयोग setOnTouchListener
  • ले आंदोलन का पता लगाने और प्रदर्शन अपनी कार्रवाई

और उसके हो गया!

public class HomeActivity extends AppCompatActivity { 

      private float x1,x2; 
      static final int MIN_DISTANCE = 150; 

      @Override 
      protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_home); 

       RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.rel); 

       final Snackbar snackbar = Snackbar.make(relativeLayout, "Helloo", Snackbar.LENGTH_INDEFINITE); 
       Snackbar.SnackbarLayout layout = (Snackbar.SnackbarLayout) snackbar.getView(); 
       layout.setOnTouchListener(new View.OnTouchListener() { 
        @Override 
        public boolean onTouch(View v, MotionEvent event) { 
         switch(event.getAction()) 
         { 
          case MotionEvent.ACTION_DOWN: 
            x1 = event.getX(); 
            break; 
          case MotionEvent.ACTION_UP: 
            x2 = event.getX(); 
            float deltaX = x2 - x1; 
           if (Math.abs(deltaX) > MIN_DISTANCE) 
            {// Left to Right swipe action 
             if (x2 > x1) 
             { 
              Toast.makeText(HomeActivity.this, "Left to Right swipe ", Toast.LENGTH_SHORT).show(); 
             } 
             // Right to left swipe action 
             else 
             { 
              Toast.makeText(HomeActivity.this, "Right to Left swipe ", Toast.LENGTH_SHORT).show(); 
              snackbar.dismiss(); 
             } 
            } 
            else 
            { 
             Toast.makeText(HomeActivity.this, "Tap or Else", Toast.LENGTH_SHORT).show(); 
            } 
            break; 
          } 

         return false; 
        } 
       }); 
       snackbar.show(); 
      } 
     } 
1

आशा है कि यह मदद मिलेगी:

OnSwipeTouchListener.java:

import android.view.GestureDetector; 
import android.view.GestureDetector.SimpleOnGestureListener; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 

public class OnSwipeTouchListener implements OnTouchListener { 

    private final GestureDetector gestureDetector; 

    public OnSwipeTouchListener (Context ctx){ 
     gestureDetector = new GestureDetector(ctx, new GestureListener()); 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     return gestureDetector.onTouchEvent(event); 
    } 

    private final class GestureListener extends SimpleOnGestureListener { 

     private static final int SWIPE_THRESHOLD = 100; 
     private static final int SWIPE_VELOCITY_THRESHOLD = 100; 

     @Override 
     public boolean onDown(MotionEvent e) { 
      return true; 
     } 

     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
      boolean result = false; 
      try { 
       float diffY = e2.getY() - e1.getY(); 
       float diffX = e2.getX() - e1.getX(); 
       if (Math.abs(diffX) > Math.abs(diffY)) { 
        if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { 
         if (diffX > 0) { 
          onSwipeRight(); 
         } else { 
          onSwipeLeft(); 
         } 
        } 
        result = true; 
       } 
       else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) { 
         if (diffY > 0) { 
          onSwipeBottom(); 
         } else { 
          onSwipeTop(); 
         } 
        } 
        result = true; 

      } catch (Exception exception) { 
       exception.printStackTrace(); 
      } 
      return result; 
     } 
    } 

    public void onSwipeRight() { 
    } 

    public void onSwipeLeft() { 
    } 

    public void onSwipeTop() { 
    } 

    public void onSwipeBottom() { 
    } 
} 

कैसे उपयोग करने के लिए: MainActivity

public class MainActivity extends AppCompatActivity { 
    CoordinatorLayout coordinatorLayout; 

    private Snackbar snackbar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     coordinatorLayout = (CoordinatorLayout)findViewById(R.id.coordinatorLayout); 

     snackbar = Snackbar 
       .make(coordinatorLayout, "Replace with your own action", Snackbar.LENGTH_INDEFINITE) 
       .setAction("RETRY", null); 

     snackbar.setActionTextColor(Color.RED); 

     View sbView = snackbar.getView(); 
     TextView textView = (TextView) sbView.findViewById(android.support.design.R.id.snackbar_text); 
     textView.setTextColor(Color.YELLOW); 
     snackbar.show(); 

     textView.setOnTouchListener(new OnSwipeTouchListener(MainActivity.this) 
     { 
      public void onSwipeTop() { 

      } 
      public void onSwipeRight() { 

      } 
      public void onSwipeLeft() { 
       snackbar.dismiss(); 
      } 
      public void onSwipeBottom() { 

      } 
     }); 

    } 
} 
+0

मुझे इस कोड को आजमाने दें – AADProgramming

1

टिप्पणी किसी में CoordinatorLayout.Behavior के उपयोग का सुझाव दिया, यह सही तरीका है। अपने आप को टच इवेंट को संभालना, लगभग अच्छा विचार है, लेकिन कोई सही दृष्टिकोण नहीं है, क्योंकि यह स्नैकबार और उसके प्रबंधक के आंतरिक कार्यान्वयन को "तोड़ देगा"।

आपको कॉलल शो() विधि के ठीक बाद Snackbar के डिफ़ॉल्ट SwipeToDismissBehavior को प्रतिस्थापित करने की आवश्यकता है।

 Snackbar snackbar = Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_INDEFINITE) 
      .setAction("Action", null).show(); 
    View snackBarView = snackbar.getView(); 
    final ViewGroup.LayoutParams lp = snackBarView.getLayoutParams(); 
    if (lp instanceof CoordinatorLayout.LayoutParams) { 
     final CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) lp; 
     final SwipeDismissBehavior<Snackbar.SnackbarLayout> behavior = new SwipeDismissBehavior<Snackbar.SnackbarLayout>(); 
     behavior.setStartAlphaSwipeDistance(0.1f); 
     behavior.setEndAlphaSwipeDistance(0.6f); 
     behavior.setSwipeDirection(SwipeDismissBehavior.SWIPE_DIRECTION_END_TO_START); 
     behavior.setListener(new SwipeDismissBehavior.OnDismissListener() { 
      @Override 
      public void onDismiss(View view) { 
       snackbar.dismiss(); 
      } 

      @Override 
      public void onDragStateChanged(int state) { 
       switch (state) { 
        case SwipeDismissBehavior.STATE_DRAGGING: 
        case SwipeDismissBehavior.STATE_SETTLING: 
         snackbar.show(); 
         break; 
        case SwipeDismissBehavior.STATE_IDLE: 
         break; 
       } 
      } 
     }); 
     layoutParams.setBehavior(behavior); 
    } 

या कम दृष्टिकोण:

View snackBarView = snackbar.getView(); 
    final ViewGroup.LayoutParams lp = snackBarView.getLayoutParams(); 
    if (lp instanceof CoordinatorLayout.LayoutParams) { 
     final CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) lp; 
     CoordinatorLayout.Behavior behavior = layoutParams.getBehavior(); 
     if(behavior instanceof SwipeDismissBehavior){ 
      ((SwipeDismissBehavior) behavior).setSwipeDirection(SwipeDismissBehavior.SWIPE_DIRECTION_END_TO_START); // or SwipeDismissBehavior.SWIPE_DIRECTION_ANY 
     } 
     layoutParams.setBehavior(behavior); 
    } 
+0

आपका छोटा दृष्टिकोण सभी उत्तरों के सबसे अच्छे विकल्प से सबसे अच्छा विकल्प लगता है। – Benjamin

+1

छोटे दृष्टिकोण पर चेतावनी पर। कोड के स्निपेट को 'ऑनशॉउन (स्नैकबार)' कॉलबैक में चलाने की आवश्यकता है। यदि पहले से चलाया जाता है, तो 'getBehavior() 'शून्य वापस आ जाएगा। – Benjamin

+0

काम करता है। @ बेन्जमिन द्वारा 'ऑनशॉउन 'में टिप्पणी के साथ सबसे अच्छा और साफ दृष्टिकोण – vida

संबंधित मुद्दे