NullPointerException while using TTS in CustomList

2019-05-05 12:36发布

问题:

I have custom listview which contains content and TTS option,while using TTS its throwing null pointer exception,Listview is also not coming it showing my applicaton has stopped.Error is showing in 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);
        }

Here I mention my logcat error also. In my logcat error, it's showing the error in this line String text = text1.getText().toString();. It's throwing NullPointerException and it is displaying the log.e file also. It is not running the speakout() method.

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)

In my custome listview i have text and TTS button,while clicking the button it has to play the audio of content.

回答1:

I would remove the call of speakOut(); in onInit(int status) and I would modify the speakOut(); function like this:

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

And your onclicklistener I would change to this here:

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

That should work for you.



回答2:

Your variable text1 is not initialized, but declared, hence doing a text1.getText(), you're essentially trying to getText() from null.

Perhaps what you want is the holder.text1 (holder from the ViewHolder)?