从另一个 class 调用 TextToSpeech
Calling TextToSpeech from a different class
我正尝试在另一个 class 中调用 TextToSpeech。
这是我的 classes 现在的样子:
//MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private SpeechRecognizer sr;
sr.setRecognitionListener(new Listener());
}
//Listener.java
public class Listener implements RecognitionListener() {
public void onResults(Bundle
MainActivity theMainActivity = new MainActivity();
//the following line always breaks the code:
tts = new TextToSpeech(theMainActivity, new TextToSpeech.OnInitListener() {/*...*/});
}
}
对于上下文,其上下文中的文件是 on GitHub。 GitHub 上的版本是工作版本,所有内容都在 MainActivity.java
中,但我试图将 Listener
移到它自己的 class Listener.java
.
收到的错误是java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.ContentResolver android.content.Context.getContentResolver()' on a null object reference
。
现在我对我尝试过的内容进行详细解释...
我试过的
当我尝试用 MainActivity.this
替换 theMainActivity
并得到错误 MainActivity is not an enclosing class
时。我知道我可以将 Listener 设置为静态 class (但不会编译),或者我可以实例化 new MainActivity().new Listener() (但不会编译)。
有人问了完全相同的问题 here,它本身被标记为重复。所以我的问题是重复的重复......但是没有给出明确的答案。
我知道我应该以某种方式 solve the NullPointerException。但是,当我在使用前记录该值时,它根本不是空的。而 theMainActivity
在 Log.d
中的值为 com.package.name.MainActivity@b76325e
。因此,如果它一开始就不是 null,但抛出 null 错误,如何修复它?
所以我认为它可能是 Android 特定的。毕竟跟android ContentResolver有点关系……
所以我读到这个 and thought that creating an application context 可以工作,除了我的 MainActivity 扩展 AppCompactActivity 而不是 Application 所以我不能写 MainActivity.context.
我知道我错过了一些基本的 Java 理解。我知道应用程序有一个应用程序和 Activity 上下文。我知道问题与在 Listener.java 中获取上下文有关。我也知道我需要以某种方式将上下文带入 Listener.java。而且我知道 Listener.java 中的 运行 new MainActivity()
可能不是一个好主意,因为我应该使用原始的 MainActivity Activity 上下文,它在第一名。我能想到的最好的解决方案是以某种方式使上下文成为 'global',任何 class 或类似的东西都可以访问......但我让 运行 陷入陷阱像 "it's not static" 和 "no you can't call use android.content.Context because you're not using android.app.Application".
有什么想法吗?
试试这个
//Listener.java
public class Listener implements RecognitionListener() {
MainActivity instance;
public Listener(MainActivity mainActivity){
this.instance = mainActivity;
}
public void onResults(Bundle
MainActivity theMainActivity = new MainActivity();
//the following line always breaks the code:
tts = new TextToSpeech(instance, new TextToSpeech.OnInitListener() {/*...*/});
}
}
//MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private SpeechRecognizer sr;
sr.setRecognitionListener(new Listener(this));
}
我正尝试在另一个 class 中调用 TextToSpeech。 这是我的 classes 现在的样子:
//MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private SpeechRecognizer sr;
sr.setRecognitionListener(new Listener());
}
//Listener.java
public class Listener implements RecognitionListener() {
public void onResults(Bundle
MainActivity theMainActivity = new MainActivity();
//the following line always breaks the code:
tts = new TextToSpeech(theMainActivity, new TextToSpeech.OnInitListener() {/*...*/});
}
}
对于上下文,其上下文中的文件是 on GitHub。 GitHub 上的版本是工作版本,所有内容都在 MainActivity.java
中,但我试图将 Listener
移到它自己的 class Listener.java
.
收到的错误是java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.ContentResolver android.content.Context.getContentResolver()' on a null object reference
。
现在我对我尝试过的内容进行详细解释...
我试过的
当我尝试用 MainActivity.this
替换 theMainActivity
并得到错误 MainActivity is not an enclosing class
时。我知道我可以将 Listener 设置为静态 class (但不会编译),或者我可以实例化 new MainActivity().new Listener() (但不会编译)。
有人问了完全相同的问题 here,它本身被标记为重复。所以我的问题是重复的重复......但是没有给出明确的答案。
我知道我应该以某种方式 solve the NullPointerException。但是,当我在使用前记录该值时,它根本不是空的。而 theMainActivity
在 Log.d
中的值为 com.package.name.MainActivity@b76325e
。因此,如果它一开始就不是 null,但抛出 null 错误,如何修复它?
所以我认为它可能是 Android 特定的。毕竟跟android ContentResolver有点关系……
所以我读到这个
我知道我错过了一些基本的 Java 理解。我知道应用程序有一个应用程序和 Activity 上下文。我知道问题与在 Listener.java 中获取上下文有关。我也知道我需要以某种方式将上下文带入 Listener.java。而且我知道 Listener.java 中的 运行 new MainActivity()
可能不是一个好主意,因为我应该使用原始的 MainActivity Activity 上下文,它在第一名。我能想到的最好的解决方案是以某种方式使上下文成为 'global',任何 class 或类似的东西都可以访问......但我让 运行 陷入陷阱像 "it's not static" 和 "no you can't call use android.content.Context because you're not using android.app.Application".
有什么想法吗?
试试这个
//Listener.java
public class Listener implements RecognitionListener() {
MainActivity instance;
public Listener(MainActivity mainActivity){
this.instance = mainActivity;
}
public void onResults(Bundle
MainActivity theMainActivity = new MainActivity();
//the following line always breaks the code:
tts = new TextToSpeech(instance, new TextToSpeech.OnInitListener() {/*...*/});
}
}
//MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private SpeechRecognizer sr;
sr.setRecognitionListener(new Listener(this));
}