2012-07-28 43 views
5

Tôi đang chơi đùa với các tính năng TTS Android và lớp TextToSpeech có phương pháp này để thiết lập một người biết lắng nghe mà được thông báo chơi khi TextToSpeech đã hoàn tất:Tại sao UtteranceProgressListener không phải là giao diện?

public int setOnUtteranceCompletedListener(TextToSpeech.OnUtteranceCompletedListener listener) 

Nhưng OnUtteranceCompletedListener được định nghĩa là public abstract class. Vì số MainActivity của tôi đã mở rộng Hoạt động, nó cũng không thể mở rộng OnUtteranceCompletedListener. Tôi có thể sử dụng phương pháp cũ với một OnUtteranceCompletedListener, nhưng điều này bị phản đối:

public int setOnUtteranceCompletedListener (TextToSpeech.OnUtteranceCompletedListener listener)` 

Tại sao OnUtteranceCompletedListener không được định nghĩa như public static interface? Tôi đang nghĩ để viết UtteranceProgressListenerImpl của riêng tôi, sau đó chỉ cần gọi phương thức onDone của MainActivity. Đây có phải là cách thích hợp hoặc là có một lựa chọn tốt hơn/sạch hơn?

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


} 

Trả lời

6

Tôi không biết mình nghĩ đó cũng là một giao diện. Tôi sử dụng mã này để có được xung quanh nó. Nó cũng có sẵn here.

Ngoài ra, hãy bỏ phiếu cho this bug Tôi đã gửi một thời gian trước đây.

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

Một giải pháp thay thế cho lớp bên trong ẩn danh là tạo một lớp bên trong hoàn toàn riêng biệt (không ẩn danh) mở rộng UtteranceProgressListener. Đây là phương pháp tôi đã áp dụng khi tôi sửa đổi một ứng dụng sử dụng văn bản thành lời nói. Tuy nhiên, tôi đã nhận được một vài ngoại lệ NoClassDefFoundError trong bảng điều khiển dành cho nhà phát triển và đã đi đến kết luận rằng cách tiếp cận này là không rõ ràng (không có ý định chơi chữ). Có vẻ như đôi khi trình nạp lớp không thể tải lớp theo thời gian hoặc ở tất cả (thật khó để biết được). Vì vậy, không chấp nhận tuyến đường đó. – Phil

Các vấn đề liên quan