0

ListViewにローカルデータベースのデータを表示し、データベースに文字列を追加して、選択した単語を読み取ることができるアプリを作成したいと思います。OOの目的で、再利用可能なTTSオブジェクトが必要です。

現在、すべてが実装されており、ListViewで単語を選択すると、エントリはトーストとして表示されます。これは、単語の文字列があることを意味します。

問題:TTSオブジェクトを作成しているときに、NullPointerExceptionが発生します。

ListViewのエントリが選択されたときに何が起こるかを示すコードは次のとおりです。

    list.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            Cursor cursor = (SQLiteCursor) list.getItemAtPosition(position); 
            String title = cursor.getString(1);
            Toast.makeText(getApplicationContext(), "selected: " + title , Toast.LENGTH_SHORT).show();

//--> App chrashes here
            AndroidTextToSpeechActivity attsa = new AndroidTextToSpeechActivity();
            attsa.speakOut(title);

        }
    }); }

これがlogcatです:

07-22 20:25:58.718:W / dalvikvm(18373):threadid = 1:キャッチされない例外で終了するスレッド(group = 0x40a6b1f8)07-22 20:25:58.738:E / AndroidRuntime(18373):致命的な例外:メイン07-22 20:25:58.738:E / AndroidRuntime(18373):java.lang.NullPointerException 07-22 20:25:58.738:E / AndroidRuntime(18373):android.content.ContextWrapper.getPackageName(ContextWrapper.java: 127)07-22 20:25:58.738:E / AndroidRuntime(18373):android.speech.tts.TextToSpeech。(TextToSpeech.java:545)07-22 20:25:58.738:E / AndroidRuntime(18373): at android.speech.tts.TextToSpeech。(TextToSpeech.java:522)07-22 20:25:58.738:E / AndroidRuntime(18373):at android.speech.tts.TextToSpeech。(TextToSpeech.java:507)07- 22 20:25:58.738:E / AndroidRuntime(18373):eu.tuts.dbexample.obj.AndroidTextToSpeechActivity。(AndroidTextToSpeechActivity.java:20)07-22 20:25:58.738:E / AndroidRuntime(18373):eu.tuts.dbexample.activities.Datenbanken $ 1.onItemClick(Datenbanken.java:79)07-22 20:25:58.738:E / AndroidRuntime(18373):androidで。 widget.AdapterView.performItemClick(AdapterView.java:292)07-22 20:25:58.738:E / AndroidRuntime(18373):android.widget.AbsListView.performItemClick(AbsListView.java:1060)07-22 20:25: 58.738:E / AndroidRuntime(18373):android.widget.AbsListView $ PerformClick.run(AbsListView.java:2516)07-22 20:25:58.738:E / AndroidRuntime(18373):android.widget.AbsListView$1。 run(AbsListView.java:3170)07-22 20:25:58.738:E / AndroidRuntime(18373):android.os.Handler.handleCallback(Handler.java:605)07-22 20:25:58.738:E / AndroidRuntime(18373):android.os.Handler.dispatchMessage(Handler.java:92)07-22 20:25:58.738:E / AndroidRuntime(18373):android.osLooper.loop(Looper.java:137)07-22 20:25:58.738:E / AndroidRuntime(18373):android.app.ActivityThread.main(ActivityThread.java:4575)07-22 20:25:58.738: E / AndroidRuntime(18373):at java.lang.reflect.Method.invokeNative(Native Method)07-22 20:25:58.738:E / AndroidRuntime(18373):at java.lang.reflect.Method.invoke(Method。 java:511)07-22 20:25:58.738:E / AndroidRuntime(18373):com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:789)07-22 20:25:58.738: E / AndroidRuntime(18373):com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)07-22 20:25:58.738:E / AndroidRuntime(18373):dalvik.system.NativeStart.main (ネイティブ方式)E / AndroidRuntime(18373):at java.lang.reflect.Method.invokeNative(Native Method)07-22 20:25:58.738:E / AndroidRuntime(18373):at java.lang.reflect.Method.invoke(Method。 java:511)07-22 20:25:58.738:E / AndroidRuntime(18373):com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:789)07-22 20:25:58.738: E / AndroidRuntime(18373):com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)07-22 20:25:58.738:E / AndroidRuntime(18373):dalvik.system.NativeStart.main (ネイティブ方式)E / AndroidRuntime(18373):at java.lang.reflect.Method.invokeNative(Native Method)07-22 20:25:58.738:E / AndroidRuntime(18373):at java.lang.reflect.Method.invoke(Method。 java:511)07-22 20:25:58.738:E / AndroidRuntime(18373):com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:789)07-22 20:25:58.738: E / AndroidRuntime(18373):com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)07-22 20:25:58.738:E / AndroidRuntime(18373):dalvik.system.NativeStart.main (ネイティブ方式)58.738:E / AndroidRuntime(18373):com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)07-22 20:25:58.738:E / AndroidRuntime(18373):dalvik.system.NativeStart .main(ネイティブメソッド)58.738:E / AndroidRuntime(18373):com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)07-22 20:25:58.738:E / AndroidRuntime(18373):dalvik.system.NativeStart .main(ネイティブメソッド)

これがTTSオブジェクトの完全なソースコードです。完全なSorcecodeを投稿して申し訳ありません-エラーが発生する場所がわかりません。

    package eu.tuts.dbexample.obj;

import java.util.Locale;
import eu.tuts.dbexample.R;
import android.app.Activity;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class AndroidTextToSpeechActivity extends Activity implements TextToSpeech.OnInitListener {
    /** Called when the activity is first created. */

    private TextToSpeech tts = new TextToSpeech(this, this);

    @Override
    public void onDestroy() {
        // Don't forget to shutdown tts!
        if (tts != null) {
            tts.stop();
            tts.shutdown();
        }
        super.onDestroy();
    }

    public void onInit(int status) {

        if (status == TextToSpeech.SUCCESS) {

            int result = tts.setLanguage(Locale.US);

            if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                Log.e("TTS", "This Language is not supported");
            } else {
                //speakOut();
                Log.d("TTS", "TTS init okay");
            }

        } else {
            Log.e("TTS", "Initilization Failed!");
        }

    }

    public void speakOut(String text) {

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

1 に答える 1

0

TextToSpeechのコンストラクターの最初のパラメーターTextToSpeechはaであり、アクティビティーで呼び出されるContextまでコンテキストは設定されないため、アクティビティーのコンストラクターでインスタンスを作成することはできません。onCreate()

これを変える:

private TextToSpeech tts = new TextToSpeech(this, this);

これに:

private TextToSpeech tts;

そして、このコードをonCreate()あなたの活動に入れてください:

tts = new TextToSpeech(this, this);
于 2012-07-22T21:37:11.523 に答える