小编an0*_*00b的帖子

如何使数据成员只能访问类和子类

可能重复:
为什么Java中没有子类可见性修饰符?

Java的访问级别表显示了4种不同的选项,用于控制对类成员的访问:

Modifier    Class  Package Subclass World
public      Y      Y       Y        Y
protected   Y      Y       Y        N
no modifier Y      Y       N        N
private     Y      N       N        N
Run Code Online (Sandbox Code Playgroud)

但是,对于"仅对类和子类可访问",没有修饰符.那是:

Modifier    Class  Package Subclass World
c++prot     Y      N       Y        N
Run Code Online (Sandbox Code Playgroud)

是否有可能在Java中定义这样的访问级别?

如果是这样,怎么样?

如果不可能,这必须归功于深思熟虑的设计原则.如果是这样,那个原则是什么.换句话说,为什么在Java中使用这样的访问级别不是一个好主意?

java

4
推荐指数
1
解决办法
2229
查看次数

TextToSpeech.setEngineByPackageName()不设置任何内容

继在提示这个答案,我放在一个电话setEngineByPackageNameonActivityResult(),当requestCode == REQ_TTS_STATUS_CHECK && TextToSpeech.Engine.CHECK_VOICE_DATA_PASS:

  tts = new TextToSpeech(this, this);
  tts.setEngineByPackageName("com.ivona.tts.voicebeta.eng.usa.kendra");          
Run Code Online (Sandbox Code Playgroud)

但无论是检查还是取消选中Always use my settings文本到语音设置,我总是得到pico默认引擎!

是的,我故意将微微引擎设置为默认值,以便我可以通过上述提示测试覆盖它.但是那种API方法似乎根本不起作用,或者......我错过了什么?

(我知道setEngineByPackageName已被弃用,因为它在初始化TTS引擎时不通知调用者,但我需要支持API 8,所以此方法是我目前的唯一选择)

android text-to-speech

4
推荐指数
1
解决办法
962
查看次数

为什么ACTION_CHECK_TTS_DATA意图"难以使用"?

负责人介绍文本到语音Android中说:"在创建活动中,良好的第一步是检查是否与相应的意图TTS资源的存在:"

Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
Run Code Online (Sandbox Code Playgroud)

但是@gregm在这个帖子中暗示:

另外,不要使用ACTION_CHECK_TTS_DATA Intent,这很难使用.

相反,请执行以下操作:

  1. 创建TextToSpeech
  2. OnInit,检查isLanguageAvailable(),如果是,你的应用程序都已设置好.如果没有,发送ACTION_INSTALL_TTS_DATA

如果我理解正确,@ gregm做/建议的是将支票推迟到.TextToSpeech.LANG_MISSING_DATAonActivityResult()onInit()

为什么这比正式方法更好?

为什么ACTION_CHECK_TTS_DATA如此"难以使用"?

android text-to-speech

4
推荐指数
1
解决办法
1929
查看次数

匿名内部类请求澄清

在 Android 上学习 TTS 时,我遇到了以下代码片段:

    speakBtn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            mTts.speak(words.getText().toString(), TextToSpeech.QUEUE_ADD, null);
        }});
Run Code Online (Sandbox Code Playgroud)

我对 Java 真的很陌生,所以我对识别各种构造的信心并不是那么好。我认为我在上面看到的是一个匿名内部类,但“ new OnClickListener() ”让我感到困惑。因此,请确认和/或更正以下任何理解:

  1. 内部类是在 new OnClickListener() 之后定义的。
  2. OnClickListener 是派生内部类的超类。
  3. (匿名)内部类只有一个成员函数:OnClick()。
  4. 内部类定义中的@Override 是什么?如果这是一个注释,那么我很困惑,因为这个答案指出匿名内部类不能被注释。

最后,有没有一种方法可以让像我这样的 n00b 更容易破译上面的代码片段?

java anonymous-types inner-classes

3
推荐指数
1
解决办法
1819
查看次数

有条件地显示按钮

我知道如何在找到布局XML后启用/禁用布局XML中定义的按钮:

  testBtn = (Button)findViewById(R.id.test);
Run Code Online (Sandbox Code Playgroud)

但除了有条件地加载布局之外,有没有办法在我的代码中使用"使用该布局XML,但不加载那里定义的按钮"?

android android-layout

3
推荐指数
1
解决办法
3983
查看次数

TextToSpeech.setEngineByPackageName() 触发 NullPointerException

我的活动onInit()包含对TextToSpeech.setEngineByPackageName()以下内容的调用:

  tts = new TextToSpeech(this, this);
  tts.setEngineByPackageName("com.ivona.tts.voicebeta.eng.usa.kendra");
Run Code Online (Sandbox Code Playgroud)

它适用于 Android 2.2.2 设备,但在 Android 2.3.4 设备上它产生 NullPointerException,具有以下堆栈跟踪:

 E/TextToSpeech.java - setEngineByPackageName(3423): NullPointerException
 W/System.err(3423): java.lang.NullPointerException
 W/System.err(3423):    at android.os.Parcel.readException(Parcel.java:1328)
 W/System.err(3423):    at android.os.Parcel.readException(Parcel.java:1276)
 W/System.err(3423):    at android.speech.tts.ITts$Stub$Proxy.setEngineByPackageName(ITts.java:654)
 W/System.err(3423):    at android.speech.tts.TextToSpeech.setEngineByPackageName(TextToSpeech.java:1356)
Run Code Online (Sandbox Code Playgroud)

因为我提供了一个硬编码的字符串参数,所以我知道该参数不是导致 NullPointerException 的原因。

我也知道setEngineByPackageName()已被弃用,但这只是从 API 14 开始,所以这不是原因。

知道是什么导致了这个 NullPointerException?

编辑:如果这不会导致无休止的轰炸,我就不会关心“为什么”:

I/TextToSpeech.java(3652): initTts() successfully bound to service
Run Code Online (Sandbox Code Playgroud)

其次是调用onInit()(由系统,而不是我的代码)。

我的希望是,如果我理解为什么会发生这种情况,我可以停止对onInit()s的轰击并从错误中优雅地恢复。

android text-to-speech

3
推荐指数
1
解决办法
1091
查看次数

如何在清单中注册 *inner* MEDIA_BUTTON BroadcastReceiver?

设法让我的耳机按钮在按下时被我的应用程序识别,但其中一个按钮需要调用 MyCustomActivity 中的方法。问题是 onReceive 的第一个参数是一个无法转换为 Activity 的上下文,因此我被迫将 BroadcastReceiver 实现为 MyCustomActivity 中的内部类。

到目前为止一切顺利,但如何在清单中注册这个内部 MediaButtonEventReceiver?

对于独立类,这很简单:

<receiver android:name=".RemoteControlReceiver">
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

对 MyCustomActivity 的 mReceiver 执行相同操作的技巧/语法是什么?

  private BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context ctx, Intent intent) {
         // ...
        }
  }
Run Code Online (Sandbox Code Playgroud)

android broadcastreceiver android-audiomanager

3
推荐指数
1
解决办法
1603
查看次数

在Java中,新旧本地之间是否存在性能差异?

在C和C++中,我知道在堆栈上实例化对象与使用"new"在堆上创建对象之间的性能可能会有很大差异.

这在Java中是一样的吗?

Java中的"new"运算符非常方便(特别是当我不必记住释放/删除使用"new"创建的对象时),但这是否意味着我可以疯狂地使用'new'?

java performance garbage-collection new-operator

2
推荐指数
3
解决办法
863
查看次数