1

ボタンが押されたときに「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): 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): 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:

有効化関数はどこで呼び出す必要がありますか? 私はスレッドから推測しますが、どうやって?

4

4 に答える 4

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

                }
            });

時間を for ループの推定値に置き換えます

于 2013-06-19T09:19:11.457 に答える
2

enableButton(false)スレッドの最後でボタンが有効になることをどのように期待していますか? 代わりに試してみてくださいenableButton(true)。間違いだと思います。:)

また、あなたの場合、UI スレッドのみがビューに触れることができます。 AsyncTaskを見てください。基本的:

  • のボタンを無効にするonPreExecute
  • でバックグラウンド作業を行うdoInBackground
  • ボタンを有効にするonPostExecute

コードにはリファクタリングが必要ですが、最終的には機能します。

于 2013-06-19T09:14:56.803 に答える
2

はい、setChecked関数を使えば可能です。 ボタンを ToggleButton次に
変更する必要があります

btnCode.setChecked(false);

ボタンは表示されますが、クリックすることはできません

btnCode.setChecked(true);
于 2013-06-19T09:15:14.673 に答える
1

メソッドでvisibilityボタンのプロパティをINVISIBLEとして設定してみてくださいonClick

btnCode.setVisibility(View.INVISIBLE);

于 2013-06-19T09:10:06.010 に答える