स्नैकबार को अपने एक्शन बटन का उपयोग करके कैसे खारिज करें?


93

एंड्रॉइड डिज़ाइन समर्थन लाइब्रेरी में अब स्नैकबार के लिए समर्थन शामिल है।

मैंने एक बनाने के लिए निम्नलिखित कोड का उपयोग किया है:

Snackbar.make(findViewById(R.id.root_layout), result, Snackbar.LENGTH_LONG)
        .setAction("Dismiss", new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        }).show();

स्नैकबार को स्वाइप द्वारा खारिज किया जा सकता है। हालाँकि, मैं इसे अपने एक्शन बटन (सेटएक्शन फंक्शन का उपयोग करके बनाया गया) का उपयोग करके खारिज करना चाहता हूं।

हालांकि ऐसा कोई भी फंक्शन उपलब्ध नहीं है जो ऐसा कर सके।


4
यहां आने वाले लोगों के लिए एक नोट के रूप में, " सामग्री " पर कार्रवाई Snackbarकरना Google सामग्री डिज़ाइन दिशानिर्देशों के विरुद्ध है ।
लॉयलर

जवाबों:


145

जावा के लिए,

.makeविधि एक रिटर्न Snackbarवस्तु। इसे बनाकर उस वस्तु का एक उदाहरण सहेजें final। फिर, onClick()कॉल में .dismiss:

final Snackbar snackBar = Snackbar.make(findViewById(android.R.id.content), "Snackbar Message", Snackbar.LENGTH_LONG);

        snackBar.setAction("Action Message", new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Call your action method here
                snackBar.dismiss();
            }
        });
        snackBar.show();

कोटलिन के लिए,

        Snackbar.make(
            findViewById(android.R.id.content),
            "Snackbar Message",
            Snackbar.LENGTH_INDEFINITE
        ).setAction("Action Message") {
            // Call action functions here
        }.show()

2
अगर मैं एक फ्लोटिंगएशनबटन के साथ एक समन्वयक लेआउट में ऐसा करता हूं, तो फ्लोटिंगएशनबॉटन नीचे नहीं आता है।
विनय डब्ल्यू।

60
कार्रवाई पर क्लिक करने पर स्नैकबार को डिफ़ॉल्ट रूप से खारिज कर दिया जाता है। स्पष्ट रूप से खारिज करने की विधि को कॉल करना अनावश्यक है।
मार्क बुइकेमा

9
@MarkBuikema पर यह सुविधा बाद में जोड़ी गई थी। प्रश्न के समय जो स्नैकबार का बहरा व्यवहार नहीं था।
EE66

JFYI, एक्शन नहीं दिखाया जाएगा अगर OnClickListenerहैnull
crgarridos

आज के अनुसार, यह कोड अलग-अलग ईवेंट वैल्यू के साथ दो बार खारिज करेगा, एक एक्शन पर क्लिक करने के लिए और दूसरा असंतुष्ट रूप से कॉल करने के लिए।
जुआन

52

एक क्लिक क्रिया को लागू करें और इसे खाली होने दें। खाली क्लिक कार्रवाई पर क्लिक करने से स्नैकबार खारिज हो जाएगा।

Snackbar.make(coordinatorLayoutView, "Service Enabled", Snackbar.LENGTH_LONG)
    .setAction("DISMISS", new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        }
    })
    .show();

आप nullएक श्रोता के लिए पास कर सकते हैं , कोई वास्तविक उदाहरण बनाने की आवश्यकता नहीं है
ccpizza

11

जब आप उपयोग करते Snackbar.LENGTH_LONGहैं तो आपको खारिज करने के लिए कार्रवाई बटन की आवश्यकता नहीं होती है, दूसरे के बाद स्वचालित रूप से खारिज कर देते हैं। आपको इस कोड का उपयोग करना चाहिए:

 Snackbar snackbar = Snackbar.make(relativeLayout, "Your Message", Snackbar.LENGTH_INDEFINITE);
            snackbar.setAction("dismiss", new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    snackbar.dismiss();
                }
            });

            snackbar.show();

इस लाइन से सावधान रहें :

Snackbar.LENGTH_INDEFINITE

5

यह एक पुराना प्रश्न है, लेकिन मैं सिर्फ स्नैकबार पर इसी तरह की सुविधा के आसपास अपना अनुभव साझा करना चाहता हूं। इसलिए हमें अपने ऐप के लिए एक डिज़ाइन मिला, जिसे स्नैकबार को अनिश्चित काल तक दिखाया जाना चाहिए और उपयोगकर्ता को इसे खारिज करने में सक्षम होना चाहिए .. लेकिन इसके अंदर DISMISS बटन नहीं होना चाहिए (Google वैसे भी स्नैकबर्स के अंदर अस्वीकृति या कार्यों को रद्द करने की अनुशंसा नहीं कर रहा है)। हमारे स्नैकबार को सिर्फ उस पर टैप करके खारिज करना पड़ा।

एकमात्र समाधान, हमारे लिए काम करना, अंत में था (मैं यहां रेट्रोलंबा का उपयोग कर रहा हूं, लेकिन मानक View.OnClickListener भी इस्तेमाल किया जा सकता है):

final Snackbar snack = ... /* create proper snackbar as alway */
snack.getView().setOnClickListener(v -> snack.dismiss());

नोट getView () बीच में कॉल करें।


आपने कहां पढ़ा है कि "Google स्नैकबार्स के अंदर डिस्मिस या रद्द कार्यों की सिफारिश नहीं कर रहा है"? मैं कारण पढ़ना चाहूंगा ....
जोसेफ

@JoseF कृपया ही प्रश्न के अंतर्गत पहली टिप्पणी की जांच;) यह सामग्री डिज़ाइन दिशानिर्देशों में है: material.io/guidelines/components/... ( "0-1 कार्रवाई, खारिज या रद्द नहीं")
दारिउज़ Wiechecki

3

स्नैकबार ( 'com.android.support:design:23.2.1' ) कई प्रकार की बर्खास्तगी कार्रवाई का समर्थन करता है। आप ईवेंट का उपयोग करके एक साधारण फ़िल्टर बना सकते हैं , जैसे कि इस उदाहरण में:

Snackbar.make(view, wornMessage, Snackbar.LENGTH_LONG).setActionTextColor(context.getResources().getColor(R.color.primary))
    .setCallback(new Snackbar.Callback() {
        @Override
        public void onShown(Snackbar snackbar) {
            super.onShown(snackbar);
        // when snackbar is showing
        }

        @Override
        public void onDismissed(Snackbar snackbar, int event) {
            super.onDismissed(snackbar, event);
            if (event != DISMISS_EVENT_ACTION) {
               //will be true if user not click on Action button (for example: manual dismiss, dismiss by swipe
            }
        }
    })
    .setAction("Undo, view1 -> {
        // if user click on Action button
}).show();

स्नैकबार के खारिज प्रकार:

/** Indicates that the Snackbar was dismissed via a swipe.*/
public static final int DISMISS_EVENT_SWIPE = 0;
/** Indicates that the Snackbar was dismissed via an action click.*/
public static final int DISMISS_EVENT_ACTION = 1;
/** Indicates that the Snackbar was dismissed via a timeout.*/
public static final int DISMISS_EVENT_TIMEOUT = 2;
/** Indicates that the Snackbar was dismissed via a call to {@link #dismiss()}.*/
public static final int DISMISS_EVENT_MANUAL = 3;
/** Indicates that the Snackbar was dismissed from a new Snackbar being shown.*/
public static final int DISMISS_EVENT_CONSECUTIVE = 4;

पुनश्च नमूना कोड में लैम्बडा के भावों का प्रयोग किया जाता है (रेट्रोबलाडा द्वारा)


सवाल बर्खास्त हैंडलर के बारे में नहीं है। सवाल यह है कि बटन क्लिक पर खारिज कैसे किया जाए।
10 जनवरी को अविश्वसनीय जान

2

मुझे भी यही समस्या थी। जब मैंने .dismiss () का उपयोग किया तो एनिमेशन अलग दिखे और दो समस्याएं थीं:

  1. FAB फिर से नीचे नहीं जाता है
  2. SnackBar अपने आप नीचे स्लाइड नहीं करता है जैसे कि यह एक क्लिक पर होगा

स्नैकबार के लिए मूल एंड्रॉइड सोर्स कोड में खोज करने पर मुझे निम्नलिखित समाधान मिला:

View snackbarView = snackbar.getView();
Button snackbarActionButton = (Button) snackbarView.findViewById(android.support.design.R.id.snackbar_action);
//snackbarActionButton.setSoundEffectsEnabled(false); // might be considered in order not to have a confusing sound because nothing was clicked by the user

फिर, मैं snackBarActionButton पर .perform पर क्लिक करूंगा

snackBarActionButton.performClick();

स्नैकबार के लिए Android स्रोत कोड का लिंक: https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/design/src/android/support/design/widget/Swackbar.java


मेरे लिए कोई मतलब नहीं है। यदि आप वास्तव में एक बटन क्लिक करते हैं, तो आपको performClick () को क्यों कॉल करना चाहिए? यह बकवास प्रतीत होता है।
10 जनवरी को अविश्वसनीय जान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.