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.
I would remove the call of
speakOut();
inonInit(int status)
and I would modify thespeakOut();
function like this:And your onclicklistener I would change to this here:
That should work for you.
Your variable
text1
is not initialized, but declared, hence doing atext1.getText()
, you're essentially trying togetText()
fromnull
.Perhaps what you want is the
holder.text1
(holder
from theViewHolder
)?