13

मैं एंड्रॉइड में स्नैकबार का उपयोग कर रहा हूं और मैंने एक क्रिया लागू की है ताकि उपयोगकर्ता कार्रवाई को पूर्ववत कर सके (कार्रवाई सूचीदृश्य में सभी आइटम साफ़ कर रही है)। सूचीदृश्य में आइटम को वापस लेना और जोड़ना पहले से ही किया जा चुका है और ठीक काम कर रहा है ।स्नैक्सबार क्रिया में, मैं कैसे सुनिश्चित कर सकता हूं कि डेटाबेस से सॉफ्ट-हटाए गए रिकॉर्ड को स्थायी रूप से हटाना सुरक्षित है?

मेरी समस्या यह है कि, आइटम sqlite डेटाबेस में संग्रहीत हैं और मैं टेबल से आइटम कैसे हटा सकता हूं? (मुझे कैसे पता चलेगा कि उपयोगकर्ता ने पूर्ववत बटन पर क्लिक नहीं किया है, ताकि मैं डेटाबेस से डेटा को पूरी तरह से हटा सकूं)।

यह OnOptionsItemSelcted()

case R.id.action_clear: 
     final List<Word> temp = new ArrayList<Word>(data); 
     data.clear(); 
     adapter.notifyDataSetChanged(); 
     View view = findViewById(R.id.layoutFavWords); 
     Snackbar.make(view,"Deleted Saved Selection.", Snackbar.LENGTH_LONG). 
     setAction("Undo", new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       for(Word word:temp) 
        data.add(word); 
       adapter.notifyDataSetChanged(); 
      } 

     }).show(); 
     break; 

तो अगर उपयोगकर्ता Snackbar के दृश्य की अवधि के दौरान वापस लाएं बटन क्लिक नहीं किया, तो मैं डेटाबेस से डेटा को स्थायी रूप से हटाने की आवश्यकता के अंदर कोड है ।

इसके लिए कोई समाधान?

+0

उन्हें तुरंत हटा सकते हैं और अगर पूर्ववत पर प्रेस उन्हें फिर से डालने? – Blackbelt

+0

हां, यह एक और विकल्प है। लेकिन क्या मैं ऐसा करना चाहता हूं जो मैं करना चाहता हूं ?? केवल तभी हटाएं जब उपयोगकर्ता ने पूर्ववत बीटीएन – chathura

+1

इमो को पर्याप्त रूप से क्लिक नहीं किया है। आप मानते हैं कि उपयोगकर्ता जानता है कि वह क्या चाहता है लेकिन वह अपना दिमाग बदल सकता है (पूर्ववत)। या आप शायद 'पुष्टिकरण की तरह' स्नैकबार चाहते हैं। प्रलेखन को देखते हुए यह टोस्ट – Blackbelt

उत्तर

19

जहां तक ​​मुझे पता है, यह डिज़ाइन द्वारा है। आपको:

  • जैसे ही उपयोगकर्ता हटाए गए बटन को टैप करता है, आइटम को हटाएं;
  • इसे अस्थायी रूप से कक्षा चर में संग्रहीत करें;
  • यदि उपयोगकर्ता पूर्ववत करता है, तो आइटम को डेटाबेस में फिर से जोड़ें।

यह दृष्टिकोण सुरक्षित और अधिक मजबूत है; आपको स्नैकबार को खारिज करने की प्रतीक्षा नहीं करनी चाहिए, क्योंकि वह कार्य भी नहीं हो सका। बस उपयोगकर्ता बल के बारे में सोचें- स्नैकबार अभी भी चालू होने पर ऐप छोड़ना: क्या आइटम को हटाया जाना चाहिए या नहीं? यह होना चाहिए।

इयान झील द्वारा this g+ post अधिक भरोसेमंद स्रोत है। टिप्पणी में आप पढ़ सकते हैं:

आप अपने यूआई तुरंत प्रतिक्रिया करने के लिए चाहते हैं ( को Snackbar के लिए इंतजार नहीं कर गायब हो जाते हैं) - अधिकांश सिस्टम (विशेष रूप से उन है कि एक बाहरी सर्वर से सिंक) की अवधारणा एक ' मुलायम हटाएं 'जहां चीजें के रूप में चिह्नित की जाती हैं। उन मामलों में, एक पूर्ववत कार्रवाई रिकॉर्ड को हटाए जाने के रूप में अनमार्क कर देगी। स्नैक्सबार खत्म होने से पहले उपयोगकर्ता को ऐप छोड़ना था, तो यह सिस्टम काम करता है (आप स्नैकबार हमेशा एनीमेशन को पूरा नहीं कर पाएंगे!)।

ऐसा करने का सबसे आसान तरीका अस्थायी रूप से रिकॉर्ड को कहीं और सहेजना है (यहां तक ​​कि एक स्थानीय चर), फिर पूर्ववत बटन दबाए जाने पर इसे दोबारा डालें।

+1

बल-छोड़ने के मामले में, यदि उपयोगकर्ता पूर्ववत करना चाहता था तो क्या होगा? विफलता के मामले में डेटा रखने के लिए बेहतर है, उपयोगकर्ता को फिर से हटाने के लिए सिर्फ एक टैप दूर है, लेकिन डेटा फिर से बनाना तुलनात्मक रूप से आसान नहीं होगा, और कुछ मामलों में असंभव उदा। कुछ सेंसर पढ़ने वाले डेटा के मामले में। निश्चित रूप से यूआई को तुरंत प्रतिक्रिया देनी चाहिए, जैसा कि मेरे मामले में, मेरे पास दो संग्रह हैं, एक आइटम के लिए और एक कूड़ेदान के लिए। तो आइटम ट्रैश में ले जाया गया है। डीबी अपडेट समय के बाद में किए जाते हैं, और प्रत्येक परिवर्तन पर डीबी ऑपरेशन की तुलना में यूआई शांत तेजी से काम करता है। – jasxir

+0

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

4

उदाहरण:

final java.util.Timer timer = new Timer(); 
Snackbar snackbar = Snackbar.make(...).setAction("Undo", new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      timer.cancel(); 
      for(Word word:temp) 
       data.add(word); 
      adapter.notifyDataSetChanged(); 
     } 
    }).show(); 
timer.schedule(new TimerTask() { 
    public void run() { 
     // delete from db 
    } 
}, snackbar.getDuration()); 

यह एक अच्छा विचार (समय (? 100-200ms) snackbar.getDuration एक छोटे से जोड़ने के लिए) के रूप में टाइमर बहुत सही समय और इस तरह से करने के मामले में नहीं कर रहे हैं हो सकता है स्नैक्सबार बंद होने से ठीक पहले उन्हें बुलाया जा सकता है, इस मामले में संभावित संभावना कम है।

7

Android समर्थन पुस्तकालय v23 Snackbar.Callback जो आप सुनने के लिए यदि Snackbar उपयोगकर्ता या टाइमआउट ने उन्हें हटा दिया उपयोग कर सकते हैं जोड़ा।

उदाहरण astinx की पोस्ट से उधार लिया:

Snackbar.make(getView(), "Hi there!", Snackbar.LENGTH_LONG).setCallback(new Snackbar.Callback() { 
      @Override 
      public void onDismissed(Snackbar snackbar, int event) { 
       switch(event) { 
        case Snackbar.Callback.DISMISS_EVENT_ACTION: 
         Toast.makeText(getActivity(), "Clicked the action", Toast.LENGTH_LONG).show(); 
         break; 
        case Snackbar.Callback.DISMISS_EVENT_TIMEOUT: 
         Toast.makeText(getActivity(), "Time out", Toast.LENGTH_LONG).show(); 
         break; 
       } 
      } 

      @Override 
      public void onShown(Snackbar snackbar) { 
       Toast.makeText(getActivity(), "This is my annoying step-brother", Toast.LENGTH_LONG).show(); 
      } 
     }).setAction("Go away!", new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

      } 
     }).show(); 
+0

क्या "दूर जाना" पर क्लिक नहीं होना चाहिए क्लिक करें()? – Radu

+0

स्नैकबार सेटएक्शन() विधि स्नैकबार को खारिज करने में संभालती है ताकि आपको इसे स्वयं करने की आवश्यकता न हो। – Irritator

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

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