问题
Getting errors on, sorry only beginner. All help would be great.
05-31 21:49:16.077: E/AndroidRuntime(655): FATAL EXCEPTION: main
05-31 21:49:16.077: E/AndroidRuntime(655): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.appal.song/com.appal.song.MainActivity}: java.lang.NullPointerException
05-31 21:49:16.077: E/AndroidRuntime(655): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
05-31 21:49:16.077: E/AndroidRuntime(655): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
05-31 21:49:16.077: E/AndroidRuntime(655): at android.app.ActivityThread.access$600(ActivityThread.java:123)
05-31 21:49:16.077: E/AndroidRuntime(655): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
05-31 21:49:16.077: E/AndroidRuntime(655): at android.os.Handler.dispatchMessage(Handler.java:99)
05-31 21:49:16.077: E/AndroidRuntime(655): at android.os.Looper.loop(Looper.java:137)
05-31 21:49:16.077: E/AndroidRuntime(655): at android.app.ActivityThread.main(ActivityThread.java:4424)
05-31 21:49:16.077: E/AndroidRuntime(655): at java.lang.reflect.Method.invokeNative(Native Method)
05-31 21:49:16.077: E/AndroidRuntime(655): at java.lang.reflect.Method.invoke(Method.java:511)
05-31 21:49:16.077: E/AndroidRuntime(655): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
05-31 21:49:16.077: E/AndroidRuntime(655): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-31 21:49:16.077: E/AndroidRuntime(655): at dalvik.system.NativeStart.main(Native Method)
05-31 21:49:16.077: E/AndroidRuntime(655): Caused by: java.lang.NullPointerException
05-31 21:49:16.077: E/AndroidRuntime(655): at com.appal.song.Fragment_1.onCreateView(Fragment_1.java:33)
05-31 21:49:16.077: E/AndroidRuntime(655): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
05-31 21:49:16.077: E/AndroidRuntime(655): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
05-31 21:49:16.077: E/AndroidRuntime(655): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
05-31 21:49:16.077: E/AndroidRuntime(655): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
05-31 21:49:16.077: E/AndroidRuntime(655): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
05-31 21:49:16.077: E/AndroidRuntime(655): at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:551)
05-31 21:49:16.077: E/AndroidRuntime(655): at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1133)
05-31 21:49:16.077: E/AndroidRuntime(655): at android.app.Activity.performStart(Activity.java:4475)
05-31 21:49:16.077: E/AndroidRuntime(655): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1929)
05-31 21:49:16.077: E/AndroidRuntime(655): ... 11 more
Here's full code, any help would be great, thanks, only beginner sorry. Trying to make text then next to it make a button that will repeat the text in speech.
public class Fragment_1 extends Fragment implements OnClickListener, OnInitListener{
private TextToSpeech txts;
private static final String TAG = "TextToSpeechDemo";
private static final int MY_DATA_CHECK_CODE = 1234;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_1,
container, false);
Button btnAdd = (Button) getView().findViewById(R.id.button1);
btnAdd.setOnClickListener(this);
btnAdd.setEnabled(false);
TextView txt = (TextView) getView().findViewById(R.id.textView1);
txt.setText("OnCreate");
// Fire off an intent to check if a TTS engine is installed
Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
TextView txt = (TextView) getView().findViewById(R.id.textView1);
if (requestCode == MY_DATA_CHECK_CODE)
{
if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS)
{
// success, create the TTS instance
txt.setText("Done result");
txts = new TextToSpeech(this, this);
txts.setLanguage(Locale.US);
Button btnAdd = (Button) getView().findViewById(R.id.button1);
btnAdd.setEnabled(true);
}
else
{
txt.setText("Missing");
// missing data, install it
Intent installIntent = new Intent();
installIntent.setAction(
TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(installIntent);
}
}
}
@Override
public void onDestroy()
{
// Don't forget to shutdown!
if (txts != null)
{
txts.stop();
txts.shutdown();
}
super.onDestroy();
}
@Override
public void onClick(View v) {
TextView txt = (TextView) getView().findViewById(R.id.textView1);
txt.setText("Click");
String myText1 = "hello";
String myText2 = "bye";
txts.speak(myText1, TextToSpeech.QUEUE_FLUSH, null);
txts.speak(myText2, TextToSpeech.QUEUE_ADD, null);
}
@Override
public void onInit(int status) {
TextView txt = (TextView) getView().findViewById(R.id.textView1);
txt.setText("status 0");
if (status == TextToSpeech.SUCCESS) {
txt.setText("status 1");
int result = txts.setLanguage(Locale.US);
if (result == TextToSpeech.LANG_MISSING_DATA ||
result == TextToSpeech.LANG_NOT_SUPPORTED) {
txt.setText("status 2");
} else {
Button btnAdd = (Button) getView().findViewById(R.id.button1);
btnAdd.setEnabled(true);
txt.setText("status 3");
}
} else {
txt.setText("status 4");
Log.e(TAG, "Could not initialize TextToSpeech.");
}
return view;
}
}
回答1:
As I said in my comment: using this while in a Fragment refers to that Fragment's instance. Fragments aren't Contexts, hence the compile time error.
To make a new TextToSpeech Object, you should use:
txts = new TextToSpeech(getActivity(), this);
Activities extend Context, so that should fix this compile-time error.
Another potential problem: for the Buttons, TextViews, etc that you are setting up onCreateView() you should be using view.findViewById() instead of getView().findViewById() (but only for the Views you're setting up in onCreateView(). The rest of the getView() calls should be fine).
It's one less method call, and getView() probably returns null until onCreateView() returns the inflated View.
Lastly, onCreateView() needs to return a View, so just before its closing brace, add:
return view;
The method with appropriate changes:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_1,
container, false);
Button btnAdd = (Button) view.findViewById(R.id.button1);
btnAdd.setOnClickListener(this);
btnAdd.setEnabled(false);
TextView txt = (TextView) view.findViewById(R.id.textView1);
txt.setText("OnCreate");
// Fire off an intent to check if a TTS engine is installed
Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
return view;
}
回答2:
You can initialize the class inside of TextToSpeech.OnInitListener() method.
// variable declaration
TextToSpeech tts;
// TextToSpeech initialization, must go within the onCreateView method
tts = new TextToSpeech(getActivity(), new TextToSpeech.OnInitListener() {
@Override
public void onInit(int i) {
if (i == TextToSpeech.SUCCESS) {
int result = tts.setLanguage(Locale.US);
if (result == TextToSpeech.LANG_MISSING_DATA ||
result == TextToSpeech.LANG_NOT_SUPPORTED) {
Log.e("TTS", "Lenguage not supported");
}
} else {
Log.e("TTS", "Initialization failed");
}
}
});
// method call
@Override
public void onClick(View v) {
speak();
}
private void speak() {
tts.speak("Text to Speech Test", TextToSpeech.QUEUE_ADD, null);
}
@Override
public void onDestroyView() {
if (tts != null) {
tts.stop();
tts.shutdown();
}
super.onDestroyView();
}
taken from: Text to Speech Youtube Tutorial
来源:https://stackoverflow.com/questions/16866173/text-to-speech-in-fragment