2012-06-01 12 views
19

एक बटन एक ऐसी क्रिया को ट्रिगर करता है जिसे केवल एक बार बुलाया जाना चाहिए। पहले कार्रवाई किया जाता है बटन अक्षम और onClick हैंडलर में छिपा हुआ है:एंड्रॉइड: एक बटन पर एकाधिक ऑनक्लिक घटनाओं को रोकें (जिसे अक्षम कर दिया गया है)

someButton.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     someButton.setEnabled(false); 
     someButton.setClickable(false); 
     someButton.setVisibility(View.GONE); 
     performTaskOnce(); 
     } 
    }); 

private void performTaskOnce() { 
    Log.i("myapp", "Performing task"); 
    //Do something nontrivial that takes a few ms (like changing the view hierarchy) 
} 

हालांकि बटन तुरंत अक्षम किया गया है, यह बहुत जल्दी कई बार दोहन से कई "onClick" घटनाओं को गति प्रदान करने फिर भी संभव है। (यानी performTaskOnce को कई बार कहा जाता है)। ऐसा लगता है कि बटन वास्तव में अक्षम होने से पहले ऑनक्लिक ईवेंट कतारबद्ध हैं।

मैं प्रत्येक एकल ऑनक्लिक हैंडल में जांच करके समस्या को ठीक कर सकता हूं कि संबंधित बटन पहले ही अक्षम है या नहीं, लेकिन यह हैक जैसा लगता है। क्या इस मुद्दे से बचने का कोई बेहतर तरीका है?

समस्या 2.3 2.3 पर समस्या होती है, मैं इसे एंड्रॉइड 4.0.3 पर पुन: पेश नहीं कर सकता। लेकिन 4.x उपकरणों की दुर्लभता को देखते हुए यह पुराने उपकरणों को बाहर करने का विकल्प नहीं है।

+0

समस्या मुझे दिनों के लिए परेशान कर रही थी .. – mohnage7

उत्तर

7

आप जब बटन को सही पर एक बूलियन चर सेट कर सकते हैं जब आप क्लिक को संसाधित करते हैं तो क्लिक किया जाता है और इसे गलत पर सेट किया जाता है।

इस तरह आप कई क्लिकों को अनदेखा कर सकते हैं और संभवतः बटन को परेशान करने से बचने वाले बटन को अक्षम नहीं कर सकते हैं।

boolean processClick=true; 
someButton.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     if(processClick) 
     { 
     someButton.setEnabled(false); 
     someButton.setClickable(false); 
     someButton.setVisibility(View.GONE); 
     performTaskOnce(); 
     } 
     processClick=false; 
     } 
    }); 

private void performTaskOnce() { 
    Log.i("myapp", "Performing task"); 
    //Do something nontrivial that takes a few ms (like changing the view hierarchy) 
} 
+3

यह सबसे आसान लगता है। आईओएस में, यूआईएप्लिकेशंस क्लास में 'startIgnoringInteractionEvents' संदेश है जो वैश्विक स्तर पर ऐसा कर सकता है। यह कई बार अच्छा हो सकता है। हालांकि, मुझे एंड्रॉइड के बराबर नहीं मिल रहा है। आप एक साधारण गार्ड का उपयोग भी कर सकते हैं "अगर (! प्रक्रियाक्लिक) वापसी;"। इससे आपको थोड़ा कम घोंसला मिल जाएगा। –

+0

@ डेव कैमरून +1 पूरी तरह से आपके साथ सहमत है –

-1

एक varieble घोषित करने और के रूप में

boolean boo = false; 
someButton.setOnClickListener(new OnClickListener() { 
@Override 
public void onClick(View v) { 
if(boo==false){ 
    someButton.setEnabled(false); 
    someButton.setClickable(false); 
    someButton.setVisibility(View.GONE); 
    boo = true; 
} 


    } 
}); 

इसका इस्तेमाल इस से आप अपने बटन पर अनेक क्लिक रोकने

आशा है कि यह मदद

+1

इसके लिए एक int का उपयोग करके, और इसे बढ़ाना, ध्वज से कम स्पष्ट है। आपने यह भी नहीं दिखाया है कि इसे वापस/कब शून्य पर सेट किया जाए। इसके अलावा, एक आवृत्ति चर के बजाय एक वर्ग चर क्यों? –

4

DRY रखने के हित में:

// Implementation 
public abstract class OneShotClickListener implements View.OnClickListener { 
    private boolean hasClicked; 

    @Override public final void onClick(View v) { 
     if (!hasClicked) { 
      onClicked(v); 
      hasClicked = true; 
     } 
    } 

    public abstract void onClicked(View v); 
} 

// Usage example 
public class MyActivity extends Activity { 
    private View myView; 

    @Override protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     myView.setOnClickListener(new OneShotClickListener() { 
      @Override public void onClicked(View v) { 
       // do clicky stuff 
      } 
     }); 
    } 
} 
+0

साफ कोड साफ़ है;) – mohnage7

1

थोड़ी देर हो चुकी है, लेकिन इस प्रयोग के किसी को हो सकता है। मेरे मामले में मैं एक और गतिविधि बुला रहा हूँ;

एक बुलियन घोषित करें;

boolean clickable; 

क्लिक श्रोता में;

if(clickable){ 
    // Launch other activity 
    clickable = false; 
} 

ऑनस्यूम कहलाते समय सक्षम करें;

@Override 
public void onResume() { 
    Log.e(TAG, "onResume"); 
    super.onResume(); 
    clickable = true; 
} 
संबंधित मुद्दे