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