JavascriptProva

martedì 2 agosto 2016

Aggiunta della voce sintetica.al CoachCall.

Aggiunta dell'attesa che termini il parlato.
L'aggiunta di OnUtteranceCompletedListener è un po' contorta.

Ho dichiarato onUtteranceCompletedListener nel contesto del Service, per poi implementarla nel contesto di Telefono.
E' un comportamento sensato?
Che cosa è, qui, nella fattispecie, OnUtteranceCompletedListener?
Sarebbe un Listener, ossia un'interfaccia.
Con quesco codice:
   mService.onUtteranceCompletedListener=new TextToSpeech.OnUtteranceCompletedListener(){

    @Override
    public void onUtteranceCompleted(String utteranceId) {
     mService.startTime();
     finish();
     
    }
    
   };
ho istanziato la variabile onUtteranceCompletedListener, presente in Service, creando un nuovo Listener.
Ma è proprio necessario che la variabile si trovi in un'altra classe?
Non potrei metterla in onCreate di Telefono?

Provo a metterla nella classe Activity Telefono.
Funziona lo stesso.
Ecco il codice:
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_telefono);
  
  onUtteranceCompletedListener=new TextToSpeech.OnUtteranceCompletedListener(){

   @Override
   public void onUtteranceCompleted(String utteranceId) {
    mService.startTime();
    finish();
    
   }
   
  };
In pratica, per creare un listener (ora faccio un po' di analisi) bisogna avere un oggetto del tipo listener.
Questo oggetto si setta poi come listener.
La cosa si può fare anche in forma anonima.
Perché qui non lo posso fare in forma anonima, ossia senza usare una variabile?
Perché devo avere una variabile a livello di classe.
Provo pure a farlo, ma devo farlo nella stessa funzione in cui uso tts, cui va poi settato il listener.
  bttRispondi.setOnClickListener(new View.OnClickListener() {
   
   @Override
   public void onClick(View v) {
    
    mService.tts.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener(){
     @Override
     public void onUtteranceCompleted(String utteranceId) {
      mService.startTime();
      finish();
      
     }
     
    });
    HashMap hashMap=new HashMap();
    hashMap.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "id");
    
    mService.tts.speak("Ciao, scemo",TextToSpeech.QUEUE_FLUSH,hashMap);
    
    
   }
  });
Funziona ugualmente, ovviamente.

Nessun commento:

Posta un commento