java - 从不同的类调用 TextToSpeech

标签 java android android-context

我正在尝试在不同的类中调用 TextToSpeech。 这是我的类(class)现在的样子:

//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 移出到它自己的类 Listener.java.

收到的错误是java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.content.ContentResolver android.content.Context.getContentResolver()”

现在我对我所尝试过的内容进行详细解释...

我尝试过的

当我尝试用 MainActivity.this 替换 theMainActivity 时,出现错误 MainActivity 不是封闭类。我知道我可以将 Listener 设为静态类(但不会编译),或者可以实例化 new MainActivity().new Listener() (但不会编译)。 有人问了完全相同的问题here它本身被标记为重复。所以我的问题是重复的……但是没有给出明确的答案。

我明白我应该以某种方式 solve the NullPointerException 。但是,当我在使用之前记录该值时,它根本不为空。相反,theMainActivityLog.d 中具有值 com.package.name.MainActivity@b76325e。因此,如果它一开始就不为 null,但却引发了 null 错误,那么如何修复它呢?

所以我想这可能是 Android 特有的。毕竟跟android ContentResolver有关系…… 所以我读了这个question并认为创建一个应用程序 context可以工作,只是我的 MainActivity 扩展了 AppCompactActivity 而不是 Application,所以我无法编写 MainActivity.context。

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

关于java - 从不同的类调用 TextToSpeech,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45978089/

相关文章:

java - 在非测试代码中使用 Hamcrest 匹配器是否可以接受

父类(super class)的Java同步私有(private)方法

android - 如何修复 Android Studio 无法连接到 Gradle 守护进程?

安卓工作室 : Cannot write to Shared Preferences in instrumented test

java - 将 ArrayList 内容转换为带逗号的字符串

android - 如何在 SDCARD 目录中创建文件

android - Nexus 4、Nexus 7、Samsung Galaxy 2 的相机人脸检测 getMaxNumDetectedFaces 返回 0

android - 正确使用上下文

android - 充气 View 的差异

java - 甚至有 2^(n) - 1 的算法位于 Theta Ө(1) 中吗?