2012-07-28 15 views
5

estoy jugando un poco con características TTS de Android y la clase de síntesis de voz tiene este método para establecer un oyente que consigue notificada una vez que el juego ha terminado TextToSpeech:¿Por qué UtteranceProgressListener no es una interfaz?

public int setOnUtteranceCompletedListener(TextToSpeech.OnUtteranceCompletedListener listener) 

Pero el OnUtteranceCompletedListener se define como public abstract class. Como mi MainActivity ya extiende la actividad, no puede extenderse OnUtteranceCompletedListener también. Podría usar el método más antiguo con una OnUtteranceCompletedListener, pero esto está en desuso:

public int setOnUtteranceCompletedListener (TextToSpeech.OnUtteranceCompletedListener listener)` 

¿Por qué no OnUtteranceCompletedListener define como public static interface? Estoy pensando en escribir mi propio UtteranceProgressListenerImpl, que luego llamará al MainActivity s onDone método. ¿Es esta la manera correcta o hay una alternativa mejor/más limpia?

private class UtteranceProgressListenerImpl extends UtteranceProgressListener { 

    private MainActivity mainActivity; 

    UtteranceProgressListenerImpl(MainActivity mA) { 
     mainActivity = mA; 
    } 

    @Override 
    public void onDone(String utteranceId) { 
     mainActivity.onDone(utteranceId); 
    } 

    @Override 
    public void onError(String utteranceId) { /* empty */ } 

    @Override 
    public void onStart(String utteranceId) { /* empty */ } 


} 

Respuesta

6

No lo sé, creo que debería ser una interfaz también. Yo uso este código para evitarlo. Está disponible here también.

Además, vote por this bug que presenté hace un tiempo.

public void setTts(TextToSpeech tts) 
    { 
     this.tts = tts; 
     if (Build.VERSION.SDK_INT >= 15) 
     { 
      tts.setOnUtteranceProgressListener(new UtteranceProgressListener() 
      { 
       @Override 
       public void onDone(String utteranceId) 
       { 
        onDoneSpeaking(utteranceId); 
       } 

       @Override 
       public void onError(String utteranceId) 
       { 
       } 

       @Override 
       public void onStart(String utteranceId) 
       { 
       } 
      }); 
     } 
     else 
     { 
      Log.d(TAG, "set utternace completed listener"); 
      tts.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener() 
      { 
       @Override 
       public void onUtteranceCompleted(String utteranceId) 
       { 
        onDoneSpeaking(utteranceId); 
       } 
      }); 
     } 
    } 
+0

Una solución alternativa a la clase interna anónima es crear una (no anónimo) clase completamente separada interior que se extiende UtteranceProgressListener. Este fue el enfoque que adopté cuando revisé una aplicación que usaba texto a voz. Sin embargo, desde entonces he recibido un par de excepciones NoClassDefFoundError en la consola de desarrollador y he llegado a la conclusión de que este enfoque es incorrecto (sin juego de palabras). Parece que ocasionalmente el cargador de clases no puede cargar la clase a tiempo o en absoluto (es difícil decir cuál). Entonces no adoptes esa ruta. – Phil

Cuestiones relacionadas