5

私はAndroidのTTS機能をいじっています.TextToSpeechクラスには、TextToSpeechの再生が終了すると通知されるリスナーを設定するこのメソッドがあります:

public int setOnUtteranceCompletedListener(TextToSpeech.OnUtteranceCompletedListener listener)

しかし、OnUtteranceCompletedListenerは として定義されpublic abstract classます。MainActivityすでにアクティビティを拡張しているため、同様に拡張することはできませんOnUtteranceCompletedListener。で古い方法を使用できますOnUtteranceCompletedListenerが、これは非推奨です。

public int setOnUtteranceCompletedListener (TextToSpeech.OnUtteranceCompletedListener listener)`

OnUtteranceCompletedListenerがとして定義されないのはなぜpublic static interfaceですか? sメソッドUtteranceProgressListenerImplを呼び出すだけの独自の を作成することを考えています。これは適切な方法ですか、それともより良い/よりクリーンな代替手段はありますか?MainActivityonDone

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


}
4

1 に答える 1

11

わかりませんが、それもインターフェースであるべきだと思います。このコードを使用して回避します。こちらでもご利用いただけます。

また、私が少し前に提出したこのバグに投票してください。

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);
                }
            });
        }
    }
于 2012-07-29T17:50:07.493 に答える