1

私のアプリには、leanback サポート ライブラリで呼び出されるサポート ライブラリクラスを拡張する子クラスがあります。このクラスを拡張する必要がありますが、残念ながら親 ( ) クラスの には使用できないメソッドがあります。SearchFragmentonPause()SearchFragment

アクティビティを終了するたびに、親クラスは不要onPause()なメソッドを呼び出す を実行します。

クラスを拡張できるが、SearchFragmentそれ自体を実行できないようにする方法はありonPause()ますか?

これは、onPause()変更できない親クラスのメソッドです。

android.support.v17.leanback.app.SearchFragment

@Override
public void onPause() {
    releaseRecognizer(); //Need to stop this from calling
    super.onPause();
}

private void releaseRecognizer() {
    if (null != mSpeechRecognizer) {
        mSearchBar.setSpeechRecognizer(null);
        mSpeechRecognizer.destroy();
        mSpeechRecognizer = null;
    }
}

また、これを行う理由は、これが Android TV > Fire TV ポートであるためです。Fire TV には speechRecognizer がありません。

4

5 に答える 5

0

onPause()アクセシビリティを備えた親SearchFragmentクラスのメソッドの 1 つで、publicサブクラスで単純にオーバーライドでき、super.onPause(). これはメソッドを親クラスに伝播しないため、infamousreleaseRecognizer()は呼び出されません。

SearchFragmentただし、システム リソースが乱用されないように、 の他のライフサイクル メソッドと適切に関連付けられたビジネス ロジックを実装するように注意する必要があります。したがって、最終的に呼び出すように、ユース ケース ロジックに従ってオーバーライドされたコードを変更する必要がありますonPause()

于 2016-08-17T03:43:23.917 に答える
0

onPauseアクティビティのライフ サイクルの一部であり、無視することはできませんが、いくつかのハックを行うことでそれを行うことができます。メソッドの動作を変更する必要がありますreleaseRecognizer()

コードは次のように変更できます。

boolean isReleased;

public void releaseRecognizer() {
   if(isReleased) {
      return;
   }
   ...
   //your code go here
   ...
   isReleased = true;
}

//Somewhere else where you acquire the recognizer again you just set it to false:

public void acquireRecognizer(){

   ...
   isReleased = false
}

このようにしてreleaseRecognizer、コードが 2 回実行されないようにします。

于 2016-08-17T03:06:20.933 に答える
-1

Android のドキュメントで言及されているように、 .NETでシステム リソースを解放することをお勧めしonpause()ます。..
_onResume()

@Override
public void onResume() {
super.onResume();
acquireRecognizer();
}

@Override
public void onPause() {
super.onPause();
releaseRecognizer();
}

onStop()または、または で認識機能を解放する必要がありますonDestroy()。このようにして、アクティビティが有効になるまでレコグナイザーを保持します。

@Override
protected void onStop() {
super.onStop();
releaseRecognizer();
}
于 2016-08-17T03:42:48.397 に答える
-1

私の見解では、他の回答でここで提案されているように SearchFragment onPause をオーバーライドできますが、 super.onPause() を削除すると、いくつかの問題に直面します。したがって、安全な解決策の 1 つは、独自の SearchFragment クラスを作成することです (そのクラスからすべてのコードをコピーし、独自のクラスを作成します)。このクラスで、onPause() メソッド内で呼び出したくないメソッドを削除します。この方法では、スーパー コールを削除していないため、このアプローチは安全です。

于 2016-08-17T04:18:48.900 に答える