-2

私のアプリでは、フラグメントとビューページャーを使用しています。アクティビティを拡張するがレイアウトを持たない別のテキスト読み上げクラスがあります。FragmentAdapter クラスでこのクラスをインスタンス化しました。これは、現在画面上にあるアクティビティに応じて話す機能を呼び出します。ただし、テキスト読み上げコンストラクターが原因でアプリがクラッシュし、強制的に閉じられます。getApplicationContext() と className.this の両方を使用しましたが、テキストから音声へのコンストラクターの原因はコンテキストであることがわかりましたが、それでもアプリがクラッシュします。コードは次のとおりです。

public class textToSpeech extends Activity{

TextToSpeech tts=null;

public textToSpeech()
{
    Log.d("text to speech", "constructor");

    tts = new TextToSpeech(textToSpeech.this , new TextToSpeech.OnInitListener() {

        @Override
        public void onInit(int status) {

            Log.d("text to speech", "init");

            if(status != TextToSpeech.ERROR) 
            {
                Log.d("text to speech", "condition");

                tts.setPitch(1.1f); 

                tts.setSpeechRate(0.4f); 

                tts.setLanguage(Locale.US);
            }

        }
    });
}

この問題を解決するために私を親切に案内してください。

startActivity() を使用してテキスト読み上げアクティビティを開始しましたが、テキスト読み上げクラスでメソッドを呼び出すと、まだ NullPointerException が発生します。(テキスト読み上げクラスをインスタンス化しました)

 tts.SpeakText("hello world"); // in fragmentPagerAdapter exception class

テキスト読み上げクラスで

public void SpeakText (String text)
{
    Log.d("text to speech", "speaking");

    if(text!=null)

            tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
}

よろしく

4

1 に答える 1

1

これは、コードをアクティビティ コンストラクターに配置したにもかかわらず、アクティビティがまだ初期化されていないためです。コードを移動するonCreateと、動作するはずです:

@Override
protected void onCreate(Bundle savedInstanceState)
{
    ...
    tts = new TextToSpeech(textToSpeech.this , new TextToSpeech.OnInitListener() {

        @Override
        public void onInit(int status) {
            Log.d("text to speech", "init");
            ...
        }
    });
}

ところで、Java のクラスは大文字で始める必要があります。Activityこれもアクティビティなので、最後に追加する必要があります(TextToSpeechActivity良い名前です)。あなたのコードを見て少し混乱しました。

于 2013-06-23T14:14:38.923 に答える