从另一个类调用TextToSpeech

我试图在另一个类中调用TextToSpeech。 以下是我的课程现在的样子:

//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() {/*...*/}); } } 

对于上下文,其上下文中的文件位于GitHub上 。 GitHub上的版本是MainActivity.java中所有内容的工作版本,但我试图将Listener移动到它自己的类Listener.java

收到的错误是java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.ContentResolver android.content.Context.getContentResolver()' on a null object reference

现在我对我的尝试进行了长时间的解释……

我试过的

当我尝试用MainActivity.this替换MainActivity.this并获得错误时, MainActivity is not an enclosing class 。 我明白我可以让Listener成为一个静态类(但不会编译),或者我可以实例化新的MainActivity()。new Listener()(但不会编译)。 有人在这里问了同样的问题,这个问题本身就是重复的。 所以我的问题是重复的副本……但是没有给出明确的答案。

我明白我应该以某种方式解决NullPointerException 。 但是,当我在使用之前记录该值时,它根本不为空。 相反, theMainActivityLog.d具有值Log.d 。 因此,如果它首先不是null,但抛出一个null错误,它怎么能修复?

所以我想也许这是特定于Android的。 毕竟,它与android ContentResolver有关…所以我读了这个问题并认为创建一个应用程序上下文会起作用,除了我的MainActivity扩展AppCompactActivity而不是Application,所以我不能编写MainActivity.context。

我知道我错过了一些基本的Java理解。 我知道应用程序有一个Application和Activity上下文。 我知道问题与在Listener.java中获取上下文有关。 我也知道我需要将上下文带入Listener.java。 我知道只是在Listener.java中运行new MainActivity()可能是一个坏主意,因为我应该使用最初调用onResults的原始MainActivity Activity上下文。 我能想到的最好的解决方案是以某种方式使上下文成为某种可以被任何类访问的“全局”,或类似的东西……但是我一直遇到像“它不是静态的”和“不是你”这样的陷阱无法调用使用android.content.Context,因为你没有使用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)); }