Android:一段时间后禁用按钮

时间:2013-06-19 09:04:14

标签: android button

我正在创建一个应用程序,当按下按钮时,会在“for循环”中生成一些啁啾声,我想在循环期间阻止按钮,并在循环结束时重新发布它们。

我尝试了这个,但应用程序崩溃了:

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;


    }
}

我在logcat中得到了这个错误:

  

06-19 11:15:00.852:E / AndroidRuntime(29419):致命异常:   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.drawable.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函数?我猜错了线程但是怎么样?

4 个答案:

答案 0 :(得分:4)

单击按钮时......直到另外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);

                }
            });

用“循环中的估算值”替换时间

答案 1 :(得分:2)

如果在线程结束时enableButton(false),您的按钮是如何启用的?请尝试enableButton(true),我确定这只是一个错字。 :)

此外,在您的情况下,只有UI线程可以触摸视图,请查看AsyncTask。基本上是:

  • 停用onPreExecute
  • 中的按钮
  • doInBackground
  • 中完成后台工作
  • 启用onPostExecute
  • 中的按钮

您的代码需要进行一些重构,但最终会有效。

答案 2 :(得分:2)

是的,可以使用setChecked功能。
您需要将按钮更改为ToggleButton
然后

btnCode.setChecked(false);

您的按钮将可见但不可点击 治疗后,做

btnCode.setChecked(true);

答案 3 :(得分:1)

尝试在 visibility 方法中将按钮的 onClick 属性设置为 INVISIBLE

btnCode.setVisibility(View.INVISIBLE);