-2

在我的应用程序中,我使用的是 Fragments 和 viewpager。我有一个单独的文本到语音类,它扩展了 Activity 但没有布局。我已经在 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 回答