Android:一段时间后禁用按钮



我正在创建一个应用程序,当按钮被按下时,它会生成一些唧唧声进入"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;

    }
}

我在日志中得到这个错误:

06-19 11:15:00.852: E/AndroidRuntime(29419): FATAL EXCEPTION:E/AndroidRuntime(29419):android.view。ViewRootImpl$ callledfromwrongthreadeexception:只有创建视图层次结构的原始线程可以触摸它的视图。06-19 11:15:00.852: E/AndroidRuntime(29419): atandroid.view.ViewRootImpl.checkThread 06-19 (ViewRootImpl.java: 4746)11:15:00.852: E/AndroidRuntime(29419): atandroid.view.ViewRootImpl.invalidateChildInParent (ViewRootImpl.java: 854)06-19 11:15:00.852: E/AndroidRuntime(29419): atandroid.view.ViewGroup.invalidateChild 06-19 (ViewGroup.java: 4077)11:15:00.852: E/AndroidRuntime(29419): atandroid.view.View.invalidate(View.java:10322) 06-19 11:15:00.852:E/AndroidRuntime (29419):android.widget.TextView.invalidateDrawable 06-19 (TextView.java: 4601)11:15:00.852: E/AndroidRuntime(29419): atandroid.graphics.drawable.DrawableContainer.invalidateDrawable (DrawableContainer.java: 250)06-19 11:15:00.852: E/AndroidRuntime(29419): atandroid.graphics.drawable.Drawable.invalidateSelf (Drawable.java: 338)06-19 11:15:00.852: E/AndroidRuntime(29419): atandroid.graphics.drawable.Drawable.setVisible 06-19 (Drawable.java: 549)11:15:00.852: E/AndroidRuntime(29419): atandroid.graphics.drawable.DrawableContainer.selectDrawable (DrawableContainer.java: 307)06-19 11:15:00.852: E/AndroidRuntime(29419): atandroid.graphics.drawable.StateListDrawable.onStateChange (StateListDrawable.java: 106)06-19 11:15:00.852: E/AndroidRuntime(29419): atandroid.graphics.drawable.Drawable.setState 06-19 (Drawable.java: 465)11:15:00.852: E/AndroidRuntime(29419): atandroid.view.View.drawableStateChanged 06-19 (View.java: 14281)11:15:00.852: E/AndroidRuntime(29419): atandroid.widget.TextView.drawableStateChanged (TextView.java: 3184)

我应该在哪里调用enable函数?我猜是从线程中出来的,但是怎么出来的?

当按钮被点击…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);
                }
            });

用for Loop

中的Your Estimations替换时间

当您在线程结束时enableButton(false)时,您如何期望您的按钮启用?试试enableButton(true)代替,我敢肯定这只是一个打字错误。:)

同样,在你的情况下,只有UI线程可以触摸视图,看看AsyncTask。基本上:

  • 禁用onPreExecute中的按钮
  • doInBackground
  • 做后台工作
  • 启用onPostExecute中的按钮

你的代码需要一些重构,但它会在最后工作。

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

btnCode.setChecked(false);

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

btnCode.setChecked(true);

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

btnCode.setVisibility (View.INVISIBLE);

最新更新