私は最初のAndroidアプリを開発中です。それは没入型に設計されており、すべてのアクティビティでNavigationBarを非表示にし、ActionBarを介して独自のナビゲーションを提供します。android.widget.MediaControllerを拡張してsetSystemUiVisibilityをオーバーライドできません
このアプリケーションでは、デフォルトのMediaControllerビューを使用します。私はandroid.widget.VideoView
を介してフルスクリーンビデオアクティビティのMediaControllerとしてandroid.widget.MediaController
を使用しています。私はandroid.media.MediaPlayer
を介してフルスクリーンでないオーディオアクティビティに対してMediaController.MediaPlayerControl
を実装するandroid.widget.MediaController
の拡張も使用しています。
android.widget.MediaController
ソースを調べた後、現在のアクティビティの上に新しいウィンドウでFrameLayoutとして表示されます。 MediaControllerが表示されるときはいつでも、ウィンドウの下にmWindowManager.addView(mDecor, mDecorLayoutParams);
を呼び出すことで、レイアウトパラメータの特定のセットを持つウィンドウに追加されます。
public void show(int timeout) {
if (!mShowing && mAnchor != null) {
setProgress();
if (mPauseButton != null) {
mPauseButton.requestFocus();
}
disableUnsupportedButtons();
updateFloatingWindowLayout();
mWindowManager.addView(mDecor, mDecorLayoutParams);
mShowing = true;
}
updatePausePlay();
// cause the progress bar to be updated even if mShowing
// was already true. This happens, for example, if we're
// paused with the progress bar showing the user hits play.
post(mShowProgress);
if (timeout != 0 && !mAccessibilityManager.isTouchExplorationEnabled()) {
removeCallbacks(mFadeOut);
postDelayed(mFadeOut, timeout);
}
}
この呼び出しの結果はSystemUiVisibilityは、このウィンドウのリセットされ、アプリがNavigationBarを示し、没入モードの出てくるということです。
私が問題にしているのは、このクラスのすべての変数は、ほとんどの方法と同様にプライベートであるということです。プライベート変数にはゲッターまたはセッターがありません。ですから、showメソッドの変数との相互作用を変更することはできません。
MediaControllerクラスを拡張している間は、showメソッドをオーバーライドすればhideNavigationをすぐに呼び出すことができます。ただし、コントローラが表示されるたびに画面上にNavigationBarが表示されます。これは私が心地よい解決策ではありません。
// MediaController implementation
@Override
public void show(int timeout) {
super.show(timeout);
// hide navigation
hideNavigation();
}
// hide navigation
public void hideNavigation() {
// get root view
View rootView = this.getRootView();
// options
final int options =
View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_FULLSCREEN |
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
;
// set visibility options
rootView.setSystemUiVisibility(options);
}
だから、私は、そのプライベートなデザインに、適切にクラスを拡張することができないことを考えると、私は保護された変数を使用して、元のコードのほとんどを使用して、完全に自分自身でそれを交換したいと思いますプライベートなものの代わりにメソッドを使用します。
このアプローチの問題は、Android Studioプロジェクトにimport com.android.internal.policy.PhoneWindow;
を追加できないことです。このパッケージをGradleビルドに含めるにはどうしたらいいですか?
compile 'com.android.internal.policy:phonewindow:1.0'
これを行うには何を変更する必要がありますか?それとも、それはできないのですか?
メソッドをandroid.view.accessibility.AccessibilityManager
という呼び出しが認識されないことがわかります。このクラスも複製できません。
なぜこの方法は利用できないのですか?
WindowsがSystemUiVisibilityオプションを変更したり、クラス全体を再現せずにshowメソッドを拡張したりすることを強制的に禁止する方法があれば、それが望ましいでしょう。
ガイダンスをいただければ幸いです。