2012-07-28 13 views
5

gram około z funkcji TTS Android i klasy TextToSpeech ma tę metodę, aby ustawić detektor, który zostanie zgłoszony po zakończeniu odtwarzania TextToSpeech:Dlaczego program UtteranceProgressListener nie jest interfejsem?

public int setOnUtteranceCompletedListener(TextToSpeech.OnUtteranceCompletedListener listener) 

Ale OnUtteranceCompletedListener jest zdefiniowany jako public abstract class. Ponieważ mój MainActivity już rozszerza działanie, nie może również rozszerzać OnUtteranceCompletedListener. Mógłbym użyć starszą metodę z OnUtteranceCompletedListener, ale to jest przestarzałe:

public int setOnUtteranceCompletedListener (TextToSpeech.OnUtteranceCompletedListener listener)` 

Dlaczego OnUtteranceCompletedListener nie zdefiniowane jako public static interface? Zastanawiam się napisać własne UtteranceProgressListenerImpl, które następnie po prostu zadzwonić do metody MainActivity s. . Czy to właściwy sposób, czy istnieje lepsza/czystsza alternatywa?

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


} 

Odpowiedz

6

Nie wiem, myślę, że powinno być interfejs jak również. Używam tego kodu, aby ominąć to. Dostępny jest również here.

Głosuj też na: this bug, które przesłałem chwilę temu.

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

Alternatywnym rozwiązaniem dla anonimowej klasy wewnętrznej jest utworzenie całkowicie oddzielnej (nieanonimowej) klasy wewnętrznej, która rozszerza kanał UtteranceProgressListener. Takie podejście przyjąłem, kiedy zmieniłem aplikację, która używała tekstu na mowę. Od tego czasu otrzymałem kilka wyjątków NoClassDefFoundError w konsoli programisty i doszedłem do wniosku, że takie podejście jest nieuzasadnione (gra słów nie jest przeznaczona). Wydaje się, że od czasu do czasu program ładujący klasy nie może załadować klasy w czasie lub w ogóle (trudno jest stwierdzić, który z nich). Więc nie przyjmuj tej trasy. – Phil

Powiązane problemy