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 */ }
}
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