当前位置: 首页 > 知识库问答 >
问题:

Android:一段时间后禁用按钮

南宫胡媚
2023-03-14

我正在创建一个应用程序,当按下按钮时,它会在“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):致命异常:Thread-5516 06-19 11:15:00.852:E/AndroidRuntime(29419):android。看法ViewRootImpl$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图。06-19 11:15:00.852:E/AndroidRuntime(29419):在android上。看法ViewRootImpl。checkThread(ViewRootImpl.java:4746)06-19 11:15:00.852:E/AndroidRuntime(29419):在android上。看法ViewRootImpl。invalidateChildInParent(ViewRootImpl.java:854)06-19 11:15:00.852:E/AndroidRuntime(29419):在android上。看法视图组。invalidateChild(ViewGroup.java:4077)06-19 11:15:00.852:E/AndroidRuntime(29419):在android上。看法看法无效(View.java:10322)06-19 11:15:00.852:E/AndroidRuntime(29419):在android上。小装置。文本视图。invalidateDrawable(TextView.java:4601)06-19 11:15:00.852:E/AndroidRuntime(29419):在android上。图样可抽出式。可抽出容器。invalidateDrawable(DrawableContainer.java:250)06-19 11:15:00.852:E/AndroidRuntime(29419):在android上。图样可抽出式。可抽出式。invalidateSelf(Drawable.java:338)06-19 11:15:00.852:E/AndroidRuntime(29419):在android上。图样可抽出式。可抽出式。setVisible(Drawable.java:549)06-19 11:15:00.852:E/AndroidRuntime(29419):在android上。图样可抽出式。可抽出容器。选择Drawable(DrawableContainer.java:307)06-19 11:15:00.852:E/AndroidRuntime(29419):在android上。图样可抽出式。StateListDrawable。onStateChange(StateListDrawable.java:106)06-19 11:15:00.852:E/AndroidRuntime(29419):在android上。图样可抽出式。可抽出式。设置状态(Drawable.java:465)06-19 11:15:00.852:E/AndroidRuntime(29419):在android上。看法看法drawableStateChanged(View.java:14281)06-19 11:15:00.852:E/AndroidRuntime(29419):在android上。小装置。文本视图。drawableStateChanged(TextView.java:3184)

我应该在哪里调用enabale函数?我猜是出格了,但怎么会呢?

共有3个答案

宿丰
2023-03-14

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

btnCode.setChecked(false);

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

btnCode.setChecked(true);
锺离韬
2023-03-14

当您在线程末尾启用按钮(false)时,您希望如何启用按钮?请尝试启用按钮(true),我确信这只是一个输入错误。:)

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

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

您的代码需要一些重构,但它最终会起作用。

楚茂实
2023-03-14

当按钮被点击时...直到另外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循环中的估计值替换时间

 类似资料:
  • 问题内容: 我正在android studio中构建一个登录样式的应用程序。作为此过程的一部分,我创建了一个规则,如果用于监视无效登录尝试次数的计数器变为0。我目前知道,当计数器变为0时,将禁用登录按钮。我想知道是否有某种方式可以在设定的时间内(而不是无限期)禁用此按钮? 问题答案: 使用以下代码。当您将活动或片段放在OnCreate()方法中时,它将在5秒钟后禁用按钮。

  • 问题内容: 我想在片段类中禁用后退按钮。在此片段中似乎不起作用。如何禁用后退按钮? 这是我的示例代码: 问题答案: 您必须重写父FragmentActivity类的onBackPressed。因此,将您的代码放在父FragmentActivity中。或者,您可以使用以下方法调用父方法: 在FragmentActivity中重写onBackPressed方法,而不调用其超类来禁用后退按钮。

  • 问题内容: 这可能是一个重复的问题,但我没有找到想要的东西。我在UI活动中调用AsyncTask, 在doInBackground中调用需要时间的方法。如果一段时间后没有返回数据,我想中断该线程。以下是我尝试执行此操作的代码。 但这并不能在30秒后停止任务,事实上,这花费了更多时间。我也尝试过,但这也不起作用。 谁能告诉我该怎么做或如何在doInBackground中使用isCancelled()

  • 我正在用OpenFL开发一个android游戏。当我在手机上测试它时,它启动得很好。现在,如果我停用游戏应用程序,并在短时间后返回它,它显示黑屏不到一秒钟,然后返回游戏。 然而,如果游戏应用程序在后台停留大约10分钟,那么如果我再次打开它,它就会显示黑屏,然后游戏在等待15秒之后就会出现,或者它根本就不会出现--只是一个黑屏。(至此,既然我可以下拉通知栏,android就没有冻结了。) 游戏中也有

  • 问题内容: 我从日志文件中获取了一些数据,想按分钟对条目进行分组: df: 我尝试了以下选项: 级别太高,想要汇总。 失败失败。 工作正常,并返回一个对象进行进一步处理,例如: grouped.Source.value_counts() 2012-01-01 12:30:00 source1 1 2012-01-01 12:31:00 source2 2 source1 2 2012-01-01

  • 我正在尝试设置一个通知,使其在某个时间间隔后出现。我本以为这能起作用,但在我的手机上运行代码时,除了在控制台上打印接收器外,似乎什么都没有发生,我似乎不知道为什么。任何帮助都将不胜感激。 这是用于设置警报的代码。 这是notification receiver类 以下是相关清单行,接收者Android:name=“.notificationreceiver”使用权限Android:name=”co