2013-06-19 3 views
1

Я создаю приложение, которое генерирует некоторые звуки чириканья в «цикл цикла», когда нажимается кнопка, и я хочу заблокировать кнопку во время цикла и повторить их, когда цикл кончено.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:

06-19 11: 15: 00,852: E/AndroidRuntime (29419): FATAL EXCEPTION: Thread-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 e.DrawableContainer.invalidateDrawable (DrawableContainer.java:250) 06-19 11: 15: 00.852: E/AndroidRuntime (29419): at android.graphics.drawable.Drawable.invalidateSelf (Drawable.java:338) 06- 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) вместо этого, я уверен, что это просто опечатка. :)

Кроме того, в вашем случае только резьба пользовательского интерфейса может касаться взглядов, посмотрите на AsyncTask.В основном:

  • отключить кнопку в onPreExecute
  • сделать фоновую работу в doInBackground
  • включить кнопку в onPostExecute

Ваш код нуждается в некоторой рефакторинга, но он будет работать в конце.

+0

Извините, ребята! Я отредактировал его, я задал вопрос с неправильной версией. Проблема, с которой я когда-то сталкивался - и теперь я снова изменяю false-> true - это то, что я пытаюсь включить кнопку в поток I creat, чтобы генерировать чириканье, где я должен сделать этот вызов? Спасибо за ваше время –

+0

Я только что отредактировал свой ответ в то же время, взгляните на него снова. – hundeva

+0

ok, большое спасибо !! Я попробую это так –

1

Try и установить свойство кнопки visibility в НЕВИДИМОМ в методе onClick.

btnCode.setVisibility (View.INVISIBLE);

+0

благодарим за отзыв, но на самом деле действие «отключить» работает, проблема в том, когда я хочу снова включить кнопку, как только цикл закончен. Но я попытаюсь установить свойство видимости как истинное, на всякий случай. –

+0

@ user1773841 после того, как цикл закончится, вы установите свойство видимости 'btnCode' обратно в ** VISIBLE ** – 7bluephoenix

+0

@ user1773841 change enableButton (true) после цикла' for'. То, что вы сделали, вместо false - false. – 7bluephoenix

2

Да, это возможно с помощью функции setChecked.
Вы должны изменить свою кнопку на ToggleButton
Тогда

btnCode.setChecked(false); 

Ваша кнопка будет видна, но не кликабельны После лечения сделать

btnCode.setChecked(true); 
+0

Извините, ребята! Я отредактировал его, я задал вопрос с неправильной версией. Проблема, с которой я когда-то сталкивался - и теперь я снова изменяю false-> true - это то, что я пытаюсь включить кнопку в поток I creat, чтобы генерировать чириканье, где я должен сделать этот вызов? Спасибо за ваше время –

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); 

       } 
      }); 

Замените время на ваши оценки для петли

Смежные вопросы