2012-04-03 17 views
5

मान लें कि आपके पास TextView है जो 0 की तरह प्रदर्शित करता है और आपके पास Button है। अब यदि उपयोगकर्ता टेक्स्टव्यू में बटन दबाता है तो एक के लिए बढ़ेगा (यह मुझे पता है कि कैसे करना है) लेकिन यदि उपयोगकर्ता बटन दबाता है और इसे रिलीज़ नहीं करता है तो TextView में संख्या को बढ़ाया जाना चाहिए जब तक उपयोगकर्ता Button जारी नहीं करता है तब तक इसे दोहराएं। दूसरे शब्दों में: जब तक उपयोगकर्ता बटन को दबाता है तब तक संख्या को बार-बार कैसे बढ़ाया जाए?लंबे समय तक बटन दबाए जाने पर एक क्रिया दोहराएं

उत्तर

6

एक सामान्य दृष्टिकोण (एंड्रॉइड के लिए विशिष्ट नहीं) प्रेस का पता लगाने और घटना को अलग से रिलीज करना होगा। प्रेस इवेंट एक आवधिक कार्य (Runnable या Thread) शुरू करता है जो काउंटर में जोड़ता है (हमें 5 बार एक सेकंड, या प्रत्येक 200 एमएस में एक बार कहें)। रिलीज इवेंट आवधिक कार्य रोकता है।

1
  1. अपने बटन के लिए एक View.OnLongClickListener सेट करें
  2. आपकी गतिविधि में Runnable दो, और प्रारंभ (लेकिन यह शुरू नहीं है) जब आप गतिविधि
  3. OnLongClickListener अद्यतन करने के अपने नियमित async कार्य करने है लोड टेक्स्टबॉक्स और उस समय की जांच करने के बाद से पहली बार
  4. OnTouchListener बनाएं जो स्पर्श ईवेंट को फिर से चलाए जाने पर Runnable को रोकता है।

मुझे पता है कि एक किसी न किसी मसौदा है, लेकिन यह पुन: उपयोग और संशोधित करने के लिए सक्षम होने के लिए एक बहुत उपयोगी पैटर्न है, तो यह इसे में अपने talons डूब लायक है ...

+0

+1 यह एंड्रॉइड विशिष्ट प्रक्रिया की तरह लगता है जो मैं अधिक सामान्य रूप से वर्णन कर रहा था। –

2

आप एक शेड्यूल करने के लिए की आवश्यकता होगी mousePressed ईवेंट प्राप्त करते समय एसिंक्रोनस दोहराना ईवेंट और mouseReleased ईवेंट प्राप्त करते समय इसे रोकें।

जावा में इसे संभालने के कई तरीके हैं। मुझे java.util.concurrent कक्षाओं का उपयोग करना पसंद है, जो काफी लचीला हैं। ध्यान रखने योग्य कुछ चीजें हैं:

यदि आपके असिंक्रोनस ईवेंट इवेंट डिस्पैच थ्रेड पर नहीं होते हैं, तो आपको SwingUtilities.invokeLater() का उपयोग करके JButton टेक्स्ट सेट करने की आवश्यकता है।

import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.ScheduledFuture; 
import java.util.concurrent.TimeUnit; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class Frame 
{ 
    public static void main(String[] args) 
    { 
     JFrame frame = new JFrame(); 
     final JButton button = new JButton("0"); 

     final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); 

     button.addMouseListener(new MouseAdapter() 
     { 
      int counter = 0; 
      ScheduledFuture<?> future; 

      @Override 
      public void mousePressed(MouseEvent e) 
      { 
       Runnable runnable = new Runnable() 
       { 
        public void run() 
        { 
         SwingUtilities.invokeLater(new Runnable() 
         { 
          public void run() 
          { 
           button.setText(String.valueOf(counter++)); 
          } 
         }); 
        } 
       }; 

       future = executor.scheduleAtFixedRate(runnable, 0, 200, TimeUnit.MILLISECONDS); 
      } 

      @Override 
      public void mouseReleased(MouseEvent e) 
      { 
       if (future != null) 
       { 
        future.cancel(true); 
       } 
      } 

     }); 

     frame.add(button); 
     frame.setSize(400, 400); 
     frame.setVisible(true); 
    } 
} 
संबंधित मुद्दे