2017-04-05 99 views
1

我正在處理我的第一個Android應用程序。它旨在讓人身臨其境,並將NavigationBar隱藏在所有活動中,同時通過ActionBar提供自己的內部導航。無法擴展android.widget.MediaController以覆蓋setSystemUiVisibility

我致力於爲此應用程序使用默認的MediaController視圖。我通過android.widget.VideoViewandroid.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選項,或者一些其他的方式來擴展顯示方法,無需複製整個類,這將是最好!

任何指導,將不勝感激。

回答

0

我現在面臨同樣的問題..我想對MediaController類進行更改。

我雖然在類中有一個錯誤,導致它不會導入PhoneWindow,並且getInstance(context)拋出錯誤,但現在我發現這是一種保護代碼的方法。

我發現計算器這樣的回答:

由於com.android.internal.telefony瀑布下的Android的內部(或隱藏)的API,你不能直接導入。但有辦法與他們合作。我建議你通過thisthis來了解如何通過思考來使用電話。

這不是關於PhoneWindow類,但我認爲可以做類似於這個類的東西。我沒有嘗試過,但也許你可以?