2012-11-27 14 views
8

मैं एक विशिष्ट मिडलवेयर (महत्व के नहीं) का उपयोग कर एंड्रॉइड में एक टीवी-रिमोट सिम्युलेटर ऐप विकसित कर रहा हूं।बटन दबाए जाने पर बार-बार कुछ कैसे करें?

वॉल्यूम बटन (वॉल्यूम + और वॉल्यूम-) के मामले में, जो मैं करने की कोशिश कर रहा हूं वह है कि बटन दबाए जाने पर बार-बार "वॉल्यूम अप" सिग्नल भेजना है।

है यही कारण है कि मैं पिछले पर की कोशिश की (बटनों में से एक के लिए कोड, अन्य नामों को छोड़ कर एक होना चाहिए):

  1. एक बूलियन चर

    boolean pressedUp = false; 
    
  2. एक घोषित घोषित निम्नलिखित AsyncTask के साथ आंतरिक वर्ग:

    class SendVolumeUpTask extends AsyncTask<Void, Void, Void> { 
    
        @Override 
        protected Void doInBackground(Void... arg0) { 
         while(pressedUp) { 
          SendVolumeUpSignal(); 
        } 
        return null; 
    } 
    

    }

  3. बटन को श्रोता जोड़ें:

    final Button buttonVolumeUp = (Button) findViewById(R.id.volup); 
    buttonVolumeUp.setOnTouchListener(new View.OnTouchListener() { 
    
        @Override 
        public boolean onTouch(View v, MotionEvent event) { 
         switch (event.getAction()) { 
    
         case MotionEvent.ACTION_DOWN: 
    
          if(pressedUp == false){ 
           pressedUp = true; 
           new SendVolumeUpTask().execute(); 
          } 
    
         case MotionEvent.ACTION_UP: 
    
          pressedUp = false; 
    
        } 
         return true; 
        } 
    }); 
    

मैं भी Increment-Decrement counter while button is pressed में के रूप में सरल धागे के साथ की कोशिश की है लेकिन न तो काम किया। एप्लिकेशन शेष बटन (चैनल, इत्यादि) के लिए बारीकी से काम करता है, लेकिन वॉल्यूम बदलना पूरी तरह अनदेखा कर दिया जाता है।

उत्तर

3

आप ब्रेक जोड़ने के लिए भूल गए; MotionEvent.ACTION_DOWN के अंत में: मामला। इसका मतलब है कि लाइन दबाया गया = झूठा; उस कार्रवाई पर भी निष्पादित हो जाता है। करने के लिए सही काम होगा:

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    switch (event.getAction()) { 

    case MotionEvent.ACTION_DOWN: 

     if(pressedUp == false){ 
      pressedUp = true; 
      new SendVolumeUpTask().execute(); 
     } 
    break; 
    case MotionEvent.ACTION_UP: 

     pressedUp = false; 

} 
    return true; 
} 
+0

धन्यवाद, अब सिग्नल भेजे जाते हैं। हालांकि, यह एक छोटी दबाने की अवधि के लिए बहुत से सिग्नल भेजता है। शायद एक काउंटर काम करना चाहिए। – Truncarlos

+4

मैं SendVolumeUpSignal() को कॉल के बीच अंतराल रखने की अनुशंसा करता हूं; उदाहरण के लिए इसे आज़माएं: 'जबकि (दबाए गए) { SendVolumeUpSignal(); थ्रेड.sleep (100);} ' –

+0

उपयोगी। धन्यवाद: डी – Truncarlos

2

आप

  • माना onKeyDown घटना
  • onKeyUp घटना पर कार्य रोक रहा है पर अपने आवर्ती कार्य शुरू है?
+1

डिवाइस की भौतिक कुंजी के लिए वे विधियां नहीं हैं? मेरा मतलब है कि मेरे रिमोट ऐप – Truncarlos

+0

हाँ में स्पर्श करने वाले लोगों का नाम है, लेकिन नाम यह नहीं है :-) –

+0

वैसे भी, पिछले उत्तर ने मुझे काफी मदद की, धन्यवाद: डी – Truncarlos

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