【问题标题】:Android: Disable button after some timeAndroid:一段时间后禁用按钮
【发布时间】:2013-06-15 17:57:01
【问题描述】:

我正在创建一个应用程序,当按下按钮时,它会在“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):致命异常: 线程 5516 06-19 11:15:00.852: E/AndroidRuntime(29419): android.view.ViewRootImpl$CalledFromWrongThreadException: 只有 创建视图层次结构的原始线程可以触及其视图。 06-19 11:15:00.852: E/AndroidRuntime(29419): 在 android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4746) 06-19 11:15:00.852:E/AndroidRuntime(29419):在 android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:854) 06-19 11:15:00.852: E/AndroidRuntime(29419): 在 android.view.ViewGroup.invalidateChild(ViewGroup.java:4077) 06-19 11:15:00.852:E/AndroidRuntime(29419):在 android.view.View.invalidate(View.java:10322) 06-19 11:15:00.852: E/AndroidRuntime(29419):在 android.widget.TextView.invalidateDrawable(TextView.java:4601) 06-19 11:15:00.852:E/AndroidRuntime(29419):在 android.graphics.drawable.DrawableContainer.invalidateDrawable(DrawableContainer.java:250) 06-19 11:15:00.852: E/AndroidRuntime(29419): 在 android.graphics.drawable.Drawable.invalidateSelf(Drawable.java:338) 06-19 11:15:00.852: E/AndroidRuntime(29419): 在 android.graphics.drawable.Drawable.setVisible(Drawable.java:549) 06-19 11:15:00.852:E/AndroidRuntime(29419):在 android.graphics.drawable.DrawableContainer.selectDrawable(DrawableContainer.java:307) 06-19 11:15:00.852: E/AndroidRuntime(29419): 在 android.graphics.drawable.StateListDrawable.onStateChange(StateListDrawable.java:106) 06-19 11:15:00.852: E/AndroidRuntime(29419): 在 android.graphics.drawable.Drawable.setState(Drawable.java:465) 06-19 11:15:00.852:E/AndroidRuntime(29419):在 android.view.View.drawableStateChanged(View.java:14281) 06-19 11:15:00.852:E/AndroidRuntime(29419):在 android.widget.TextView.drawableStateChanged(TextView.java:3184)

我应该在哪里调用启用函数?我猜出线程但是如何?

【问题讨论】:

  • 尝试使用AsyncTask 而不是你目前正在做的事情。
  • 阅读此问题的访问者可能希望在 [stackoverflow.com/questions/5608720/… 查看解决方案。qezt 的解决方案使用SystemClock.elapsedRealtime() - mLastClickTime 来确定最近是否单击了按钮。

标签: android button


【解决方案1】:

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

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

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

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

【讨论】:

  • 对不起各位!!我已经编辑了它,我用错误的版本问了这个问题。我曾经遇到的问题 - 现在我再次更改 false-> true - 是我试图将按钮启用到我创建的线程中以生成啁啾声,我应该在哪里进行调用?感谢您的宝贵时间
  • 我刚刚同时编辑了我的答案,再看一遍。
【解决方案2】:

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

btnCode.setChecked(false);

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

btnCode.setChecked(true);

【讨论】:

  • 对不起各位!!我已经编辑了它,我用错误的版本问了这个问题。我曾经遇到的问题 - 现在我再次更改 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);

                }
            });

在 for 循环中将时间替换为您的估计

【讨论】:

    【解决方案4】:

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

    btnCode.setVisibility(View.INVISIBLE);

    【讨论】:

    • 感谢反馈,但实际上“禁用”操作有效,问题是当我想再次启用按钮时,一旦循环结束。但我会尝试将可见性属性设置为 true,以防万一。
    • @user1773841 循环结束后,您所做的是将btnCode 的可见性属性设置回 VISIBLE
    • @user1773841 在for 循环之后更改 enableButton(true)。你所做的是假而不是真!!!
    • 对不起各位!!我已经编辑了它,我用错误的版本问了这个问题。我曾经遇到的问题 - 现在我再次更改 false-> true - 是我试图将按钮启用到我创建的线程中以生成啁啾声,我应该在哪里进行调用?感谢您的宝贵时间
    • @user1773841 正如我在您的帖子下方评论...尝试使用AsyncTask 来实现您要实现的目标
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多