我正在處理我的第一個Android應用程序。它旨在讓人身臨其境,並將NavigationBar隱藏在所有活動中,同時通過ActionBar提供自己的內部導航。無法擴展android.widget.MediaController以覆蓋setSystemUiVisibility
我致力於爲此應用程序使用默認的MediaController視圖。我通過android.widget.VideoView
將android.widget.MediaController
用作全屏視頻活動的MediaController。我還使用android.widget.MediaController
的擴展名,它通過android.media.MediaPlayer
實現了非全屏音頻活動的MediaController.MediaPlayerControl
。
在調查了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復位此窗口,並且該應用出來的沉浸式模式,顯示導航欄。
我的問題是,這個類的每個變量都是私有的,就像大多數方法一樣。任何私有變量都有零個getter或setter。所以,我無法改變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);
}
所以,因爲我不能正確地擴展類,由於其私人設計,我想完全是我自己的替換它,使用的大部分代碼從原來的,只是受保護的變量和方法而不是私人的。
這種方法的問題是我不能將import com.android.internal.policy.PhoneWindow;
添加到我的Android Studio項目中。我如何在我的Gradle構建中包含這個包?
compile 'com.android.internal.policy:phonewindow:1.0'
什麼我需要改變,以使這項工作?或者,這是不可能的?
此外,我可以看到撥打getInstance(Context context)
方法的android.view.accessibility.AccessibilityManager
未被識別,因此也會阻止我複製此類。
爲什麼此方法不可用?
如果有一些其他的方式來強行阻止Windows改變其SystemUiVisibility選項,或者一些其他的方式來擴展顯示方法,無需複製整個類,這將是最好!
任何指導,將不勝感激。