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


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

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

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

            }
        }).show();

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

हालांकि ऐसा कोई प्रतीत नहीं होता है जो ऐसा कर सकता है।


61
2018-06-09 10:22


मूल


यहां आने वाले लोगों के लिए एक नोट के रूप में, "डिसमिस" कार्रवाई करना Snackbar के खिलाफ है Google सामग्री डिजाइन दिशानिर्देश। - Loyalar


जवाब:


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

final Snackbar snackBar = Snackbar.make(findViewById(R.id.root_layout), result, Snackbar.LENGTH_LONG);

snackBar.setAction("Dismiss", new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        snackBar.dismiss();
    }
}); 
snackBar.show();

101
2018-06-09 10:25



अगर मैं फ़्लोटिंगएक्शन बटन के साथ एक समन्वयक लेआउट में ऐसा करता हूं, तो फ़्लोटिंगएक्शन बटन नीचे नहीं आ जाता है। - Vinay Wadhwa
कार्रवाई पर क्लिक करते समय डिफ़ॉल्ट रूप से स्नैकबार को खारिज कर दिया जाता है। स्पष्ट रूप से बर्खास्तगी विधि को बुलाकर अनावश्यक है। - Mark Buikema
@MarkBuikema इस सुविधा को बाद में जोड़ा गया था। इस सवाल के समय कि स्नैकबार का बहरा व्यवहार नहीं था। - EE66
जेएफवाईआई, अगर कार्रवाई नहीं की जाएगी तो कार्रवाई नहीं की जाएगी OnClickListener है null - crgarridos


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

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

36
2017-09-20 11:25





जब आप उपयोग करते हैं 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

6
2017-08-09 23:41





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

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

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

ध्यान दें getView () बीच में कॉल करें।


3
2018-02-17 11:25



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


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

  1. एफएबी फिर से नीचे नहीं जाता है
  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

फिर, मैं स्नैप पर क्लिक करूँगा .performBickAction बटन पर क्लिक करें

snackBarActionButton.performClick();

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


2
2018-03-06 18:55



मुझे कोई समझ नहीं आता है। यदि आप वास्तव में एक बटन पर क्लिक करते हैं तो आपको PerformClick () को क्यों कॉल करना चाहिए? यह बकवास लगता है। - The incredible Jan


स्नैकबार (से '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;

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


1
2018-04-09 20:24



सवाल एक खारिज हैंडलर के बारे में नहीं है। सवाल यह है कि बटन क्लिक पर खारिज कैसे करें। - The incredible Jan