在CustomListview中使用TTS时出现NullPointerException

时间:2013-07-18 12:28:05

标签: java android text-to-speech

我有自定义列表视图,其中包含内容和TTS选项,在使用TTS时抛出空指针异常,Listview也没有显示我的应用程序已停止。错误在Logcat中显示。

Applicationadapter.java

public class ApplicationAdapter extends ArrayAdapter<Application> implements
TextToSpeech.OnInitListener{
    private List<Application> items;
    private LayoutInflater inflator;
    private MainActivity activity;

    private ProgressDialog dialog;
    public TextToSpeech tts;
    public ImageButton btnaudioprayer;
   public TextView text1;

    ArrayAdapter<String> adapter;

    public ApplicationAdapter(MainActivity context, List<Application> items){
        super(context, R.layout.activity_row, items);
        this.items = items;

        inflator = LayoutInflater.from(getContext());
        activity=context;


    }

    @Override
    public int getCount(){
        return items.size();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        ViewHolder holder = null;

        tts = new TextToSpeech(activity, ApplicationAdapter.this);


        //View v = convertView;
        if ( convertView == null ){ 
            convertView = inflator.inflate(R.layout.activity_row, null);
            holder = new ViewHolder();
            holder.text2 = (TextView) convertView.findViewById(R.id.text2);
            holder.text1 = (TextView) convertView.findViewById(R.id.text1);
            holder.count = (TextView) convertView.findViewById(R.id.count); 
            holder.pray  = (Button) convertView.findViewById(R.id.pray);
            holder.chk = (CheckBox) convertView.findViewById(R.id.checkbox);
            holder.btnSpeak = (ImageButton) convertView.findViewById(R.id.btnaudioprayer);

            convertView.setTag(holder);
        }else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.chk.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton view,
                    boolean isChecked) {
                int getPosition = (Integer) view.getTag();
                items.get(getPosition).setSelected(view.isChecked());

            }
        });

        holder.pray.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                int getPosition= (Integer)v.getTag();
                StringBuffer sb1 = new StringBuffer();
                sb1.append("ID :");
                sb1.append(Html.fromHtml(""+items.get(getPosition).getId()));
                sb1.append("\n");
                activity.praydata(items.get(getPosition).getId());

            }


        });


         holder.btnSpeak.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View V) {


                   speakOut();
                }

            }); 

        Application app = items.get(position);
        holder.chk.setTag(position);
        holder.pray.setTag(position);
        holder.text2.setText(Html.fromHtml(app.getTitle()));
        holder.text1.setText(Html.fromHtml(app.getContent()));
        holder.count.setText(app.getCount()+"");
        holder.chk.setChecked(app.isSelected());

        return convertView;
    }
    static class ViewHolder {
        public TextView text2;
        public TextView text1;
        public TextView count;
        public CheckBox chk;
        public Button pray;
        public ImageButton btnSpeak;
        private TextToSpeech tts;
    }
    @Override
    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();
            }

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


    }

    private void speakOut() {

            String text = text1.getText().toString();

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

这里我也提到了我的logcat错误。在我的logcat错误中,它显示了此行中的错误 String text = text1.getText().toString();。它正在抛出NullPointerException,它也在显示log.e文件。它没有运行speakout()方法。

07-18 12:17:11.456: E/TTS(2314): This Language is not supported
07-18 12:17:11.456: I/TextToSpeech(2314): Connected to ComponentInfo{com.svox.pico/com.svox.pico.PicoService}
07-18 12:17:11.586: D/AndroidRuntime(2314): Shutting down VM
07-18 12:17:11.586: W/dalvikvm(2314): threadid=1: thread exiting with uncaught exception (group=0x40a70930)
07-18 12:17:11.597: E/AndroidRuntime(2314): FATAL EXCEPTION: main
07-18 12:17:11.597: E/AndroidRuntime(2314): java.lang.NullPointerException
07-18 12:17:11.597: E/AndroidRuntime(2314):     at com.example.jsonandroid.ApplicationAdapter.speakOut(ApplicationAdapter.java:182)
07-18 12:17:11.597: E/AndroidRuntime(2314):     at com.example.jsonandroid.ApplicationAdapter.onInit(ApplicationAdapter.java:168)
07-18 12:17:11.597: E/AndroidRuntime(2314):     at android.speech.tts.TextToSpeech.dispatchOnInit(TextToSpeech.java:640)
07-18 12:17:11.597: E/AndroidRuntime(2314):     at android.speech.tts.TextToSpeech.access$1000(TextToSpeech.java:52)
07-18 12:17:11.597: E/AndroidRuntime(2314):     at android.speech.tts.TextToSpeech$Connection.onServiceConnected(TextToSpeech.java:1297)
07-18 12:17:11.597: E/AndroidRuntime(2314):     at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1101)
07-18 12:17:11.597: E/AndroidRuntime(2314):     at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1118)
07-18 12:17:11.597: E/AndroidRuntime(2314):     at android.os.Handler.handleCallback(Handler.java:725)
07-18 12:17:11.597: E/AndroidRuntime(2314):     at android.os.Handler.dispatchMessage(Handler.java:92)
07-18 12:17:11.597: E/AndroidRuntime(2314):     at android.os.Looper.loop(Looper.java:137)
07-18 12:17:11.597: E/AndroidRuntime(2314):     at android.app.ActivityThread.main(ActivityThread.java:5039)
07-18 12:17:11.597: E/AndroidRuntime(2314):     at java.lang.reflect.Method.invokeNative(Native Method)
07-18 12:17:11.597: E/AndroidRuntime(2314):     at java.lang.reflect.Method.invoke(Method.java:511)
07-18 12:17:11.597: E/AndroidRuntime(2314):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)

在我的自定义列表视图中,我有文本和TTS按钮,点击按钮时,它必须播放内容的音频。

2 个答案:

答案 0 :(得分:3)

您的变量text1未初始化,但已声明,因此正在执行text1.getText(),您实际上是从getText()尝试null

也许您想要的是holder.text1holder中的ViewHolder)?

答案 1 :(得分:2)

我会删除speakOut();onInit(int status)的来电,我会像这样修改speakOut();函数:

private void speakOut(String text) {
    tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
}

你的onclicklistener我会在这里改变:

 @Override
 public void onClick(View v) {
     View parent = (View)v.getParent();
     ViewHolder vh = (ViewHolder)parent.getTag();
     TextView tv = vh.text1;
     speakOut(tv.getText().toString());
 }

那应该适合你。