2013-06-19 43 views
1

我正在創建一個應用程序,當按下按鈕時,它會生成一些「for循環」的啁啾聲,並且我想在循環中阻止按鈕,並在循環時釋放它們結束了。Android:在一段時間後關閉按鈕

這個我試過,但應用程序崩潰:

package android.nacho.UltraSoundSender; 


import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 

public class UltraSoundSender extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_ultra_sound_sender); 


     Button btnCode = (Button) findViewById(R.id.btnCode); 
     btnCode.setOnClickListener(new OnClickListener() { 

      //@Override 
      public void onClick(View arg0) {    

       enableButton(false); 

       new Thread(new Runnable() 
       { 
        public void run() 
        { 

         //working=false; 
         // int Code=Integer.parseInt(((EditText)findViewById(R.id.Code)).getText().toString()); 
         //((EditText)findViewById(R.id.Code)).setText(""); 
         String word= ((EditText)findViewById(R.id.Code)).getText().toString(); 
         Integer digits[]= new Integer[64]; 
         int NumChar= word.length(); 

         //This split the string in chars 
         for(int i = 0; i < NumChar ; i++){ 

          digits[i]=(int)word.charAt(i); 

          } 

         //Values of the chirp 
         int startFreq = 3000; 
         int endFreq = 7000; 
         double impulseDuration = 50; 



         for(int IndexChar= 0; IndexChar< NumChar ; IndexChar++) 
         { 

          new ChirpGenerator().playDOWN(startFreq, endFreq, impulseDuration, digits[IndexChar]); 
          try { 
           Thread.sleep(500); 
          } catch (InterruptedException e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } 
         } 


         enableButton(true); 
        } 

       }).start(); 

      } 
     }); 


} 

    //Enable/disable button 
    private void enableButton(boolean isEnable) 
    { 
     ((Button)findViewById(R.id.btnCode)).setEnabled(isEnable); 

} 



    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_ultra_sound_sender, menu); 
     return true; 


    } 
} 

我得到這個errores在logcat中:

十一月6日至19日:15:00.852:E/AndroidRuntime(29419):致命例外: 線程-5516 06-19 11:15:00.852:E/AndroidRuntime(29419): android.view.ViewRootImpl $ CalledFromWrongThreadException:只有創建視圖層次結構的 原始線程才能觸摸其視圖。 06-19 11:15:00.852:E/AndroidRuntime(29419):at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4746)06-19 11:15:00.852:E/AndroidRuntime(29419): at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:854) 06-19 11:15:00.852:E/AndroidRuntime(29419):at android.view.ViewGroup.invalidateChild(ViewGroup.java:4077)06 -19 11:15:00.852:E/AndroidRuntime(29419):at android.view.View.invalidate(View.java:10322)06-19 11:15:00.852: E/AndroidRuntime(29419):at android.widget.TextView.invalidateDrawable(TextView.java:4601)06-19 11:15:00.852:E/AndroidRuntime(29419):at android.graphics.drawabl (DrawableContainer.java:250) 06-19 11:15:00.852:E/AndroidRuntime(29419) 19 11:15:00.852:E/AndroidRuntime(29419):at android.graphics.drawable.Drawable.setVisible(Drawable.java:549)06-19 11:15:00.852:E/AndroidRuntime(29419):at android.graphics.drawable.DrawableContainer.selectDrawable(DrawableContainer.java:307) 06-19 11:15:00.852:E/AndroidRuntime(29419):at android.graphics.drawable.StateListDrawable.onStateChange(StateListDrawable.java: 106) 06-19 11:15:00.852:E/AndroidRuntime(29419):at android.graphics.drawable.Drawable.setState(Drawable.java:465)06- 19 11:15:00.852:E/AndroidRuntime(29419):at android.view.View.drawableStateChanged(View.java:14281)06-19 11:15:00.852:E/AndroidRuntime(29419):at android.widget.TextView.drawableStateChanged(TextView.java:3184)

我應該在哪裏調用enabale功能?我猜想脫離線程但是如何?

+1

嘗試使用'AsyncTask'而不是你目前正在做的事情。 – 7bluephoenix

回答

2

當您在線程結束時enableButton(false)時,您如何獲得啓用按鈕?相反,嘗試enableButton(true),我確信它只是一個錯字。 :)

另外,在你的情況下,只有UI線程可以觸及視圖,看看AsyncTask。基本上是:

  • 禁用onPreExecute
  • 按鈕做doInBackground
  • 後臺工作onPostExecute

你的代碼需要一些重構啓用按鈕,但它會在結束工作。

+0

對不起傢伙!我編輯了它,我用錯誤的版本問了問題。我曾經有過的問題 - 現在我再次改變了false-> true - 是我試圖啓用按鈕進入我創建的線程來生成啁啾聲,我應該在哪裏進行調用?感謝您的時間 –

+0

我剛剛編輯了我的答案,再次看看它。 – hundeva

+0

好的,非常感謝你!我會以這種方式嘗試 –

1

嘗試和在onClick方法設置的按鈕的visibility屬性作爲INVISIBLE

btnCode.setVisibility(View.INVISIBLE);

+0

感謝您的反饋,但實際上「禁用」操作起作用,問題是當我想要再次啓用按鈕時,一旦循環結束。但我會嘗試將可見性屬性設置爲true,以防萬一。 –

+0

@ user1773841在循環結束後,您將'btnCode'的visibility屬性設置爲** VISIBLE ** – 7bluephoenix

+0

@ user1773841在'for'循環之後更改enableButton(true)。你所做的是把錯誤而不是真正的! – 7bluephoenix

2

是的,它可以通過使用setChecked函數。
你需要改變你的按鈕,切換按鈕的
然後

btnCode.setChecked(false); 

你的按鈕將是可見的,但治療不點擊 後,做

btnCode.setChecked(true); 
+0

對不起傢伙!我編輯了它,我用錯誤的版本問了問題。我曾經有過的問題 - 現在我再次改變了false-> true - 是我試圖啓用按鈕進入我創建的線程來生成啁啾聲,我應該在哪裏進行調用?謝謝你的時間 –

3

按鈕被點擊時...它不可點擊,直到中斷5秒

btnCode.setOnClickListener(new OnClickListener() 
      { 
       public void onClick(final View v) 
       { 
        v.setClickable(false); 
        new Handler().postDelayed(new Runnable() 
        { 
         public void run() 
         { 
          v.setClickable(true); 
         } 
        }, 500); 

       } 
      }); 

用你的估計替換循環中的時間