NullPointerException while using TTS in CustomListview

左心房为你撑大大i 提交于 2019-12-22 08:39:31

问题


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)?



来源:https://stackoverflow.com/questions/17723438/nullpointerexception-while-using-tts-in-customlistview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!