4

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

应用适配器.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 按钮,单击按钮时它必须播放内容的音频。

4

2 回答 2

3

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

也许你想要的是holder.text1holder来自ViewHolder)?

于 2013-07-18T12:30:23.003 回答
2

我会删除 in 的调用,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());
 }

那应该对你有用。

于 2013-07-18T13:07:43.703 回答