无法解析符号'setOnClickListener' - AndroidStudio

时间:2015-06-08 04:01:29

标签: java android android-studio android-asynctask android-button

我是Java / Android编程的新手/初学者。我一直试图这样做,当我在我的应用程序中按下一个给定的按钮时它会产生一个DTMF​​音,但是当我尝试使用setOnTouchListener时,Android Studio会向我显示该错误。它还为MotionEvent提供了一个错误,指出 Expression expected

以下是代码的重要部分:

boolean pressedCCW = false;
    class SendCCWTone extends AsyncTask<Void,Void,Void>{
        @Override
        protected Void doInBackground(Void... arg0){
            ToneGenerator toneGen;
            toneGen = new ToneGenerator(AudioManager.STREAM_DTMF,100);
            while(pressedCCW){
                toneGen.startTone(ToneGenerator.TONE_DTMF_1);
            }
            toneGen.stopTone();
            toneGen.release();
            createLog("CCW");
            return null;
        }
    }

final Button buttonCCW = (Button) findViewById(R.id.counter_clockwise);
    buttonCCW.setOnTouchListener(new View.OnTouchListener(){// Where the error is
        @Override
        public boolean onTouch(View v, MotionEvent event){// Where the other error is located
            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:
                    if(pressedCCW == false){
                        pressedCCW = true;
                        new SendCCWTone().execute();
                    }
                    break;
                case MotionEvent.ACTION_UP:
                    pressedCCW = false;
            }
            return true;
        }
    });

4 个答案:

答案 0 :(得分:1)

您正在OnTouchListener内创建setOnClickListener。如果您需要TouchListener,则应使用setOnTouchListener代替setOnClickListener

进行注册
buttonCCW.setOnTouchListener(new View.OnTouchListener(){
        @Override
        public boolean onTouch(View v, MotionEvent event){
            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:
                    if(pressedCCW == false){
                        pressedCCW = true;
                        new SendCCWTone().execute();
                    }
                    break;
                case MotionEvent.ACTION_UP:
                    pressedCCW = false;
            }
            return true;
        }
    });

答案 1 :(得分:0)

如果将setOnTouchListener放在活动的onCreate()方法中,则可以解决此问题。

答案 2 :(得分:-1)

尝试将此添加到您的代码中:

 implements View.OnTouchListener

并使用setOnTouchListner而不是setOnClickListener。

buttonCCW.setOnListener(new View.OnTouchListener(){// Where the error is
    @Override
    public boolean onTouch(View v, MotionEvent event){// Where the other error is located
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                if(pressedCCW == false){
                    pressedCCW = true;
                    new SendCCWTone().execute();
                }
                break;
            case MotionEvent.ACTION_UP:
                pressedCCW = false;
        }
        return true;
    }
});

答案 3 :(得分:-1)

不是使用setOnClickListener,而是可以在XML中设置onClick并指向一个方法(它做同样的事情并且看起来更好)。在这种情况下,你有一个像produceSound这样的方法:

public void produceSound(View view) {
  // your onClick method
}

并在活动的XML中,找到该按钮的位置counter_clockwise,然后将android:onClick="produceSound"添加到按钮的XML中。

如果您感到好奇,请点击此处:How exactly does the android:onClick XML attribute differ from setOnClickListener?

但是,如果您使用onTouch,那么您将不得不坚持其他人的建议。 XML不支持android:onTouch属性。