Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 隐藏在YouTube播放器全屏系统UI下的工具栏覆盖_Android_Android Layout_Youtube Api_Android Youtube Api - Fatal编程技术网

Android 隐藏在YouTube播放器全屏系统UI下的工具栏覆盖

Android 隐藏在YouTube播放器全屏系统UI下的工具栏覆盖,android,android-layout,youtube-api,android-youtube-api,Android,Android Layout,Youtube Api,Android Youtube Api,我在我的活动中使用了一个,并试图在玩家全屏时用一个应用程序栏(又名动作栏)覆盖该玩家。我遵循YouTube播放器API“Overlay ActionBar Demo”和YouTubePlayerFragment文档中的指导原则和示例(更多详细信息见下文) 当我从内核扩展并使用内核时,所有这些都工作得很好。但当我切换到使用支持时,会出现一些问题: 工具栏位于状态栏和导航栏下 当工具栏位于播放机顶部时,播放机不再播放 就定位和覆盖而言,播放器全屏模式似乎用于将操作栏(以及状态栏和导航栏)视为系统

我在我的活动中使用了一个,并试图在玩家全屏时用一个应用程序栏(又名动作栏)覆盖该玩家。我遵循YouTube播放器API“Overlay ActionBar Demo”和YouTubePlayerFragment文档中的指导原则和示例(更多详细信息见下文)

当我从内核扩展并使用内核时,所有这些都工作得很好。但当我切换到使用支持时,会出现一些问题:

  • 工具栏位于状态栏和导航栏下
  • 当工具栏位于播放机顶部时,播放机不再播放
就定位和覆盖而言,播放器全屏模式似乎用于将操作栏(以及状态栏和导航栏)视为系统UI的一部分,但工具栏不再如此

关于为什么会发生这种情况,或者我如何使用工具栏在全屏模式下正确覆盖YouTube播放器,有什么想法吗?我意识到工具栏只是另一个视图,我可能会强制它在状态栏下调整大小和位置,我可以设置一个工具栏,并相应地显示和隐藏我的工具栏,但我希望有一个更干净的解决办法,我错过了

以下是一个屏幕截图:

更多细节:我能够在“Overlay ActionBar Demo”示例应用程序(
ActionBarDemoActivity
)中重现此行为,并进行了以下更改:

  • 扩展
    AppCompatActivity
  • 将导入从
    android.app.ActionBar
    更改为
    android.support.v7.app.ActionBar
  • 将工具栏添加到布局

    <FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
        <view
            class="com.examples.youtubeapidemo.ActionBarDemoActivity$ActionBarPaddedFrameLayout"
            android:id="@+id/view_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
        ...
    
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:minHeight="?attr/actionBarSize"
            android:background="@color/material_deep_teal_500" />
    
    </FrameLayout>
    
  • 将工具栏设置为
    onCreate()中的操作栏

请注意,示例应用程序还执行以下操作(我没有更改这些操作):

  • 实施
  • 扩展布局并在非全屏时设置填充,以便内容显示在工具栏下方

    @Override
    public void onFullscreen(boolean fullscreen) {
        viewContainer.setEnablePadding(!fullscreen);
        ...        
    }
    
    public static final class ActionBarPaddedFrameLayout extends FrameLayout {
    
        public void setEnablePadding(boolean enable) {
              paddingEnabled = enable;
              requestLayout();
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int topPadding =
            paddingEnabled && actionBar != null && actionBar.isShowing() ? actionBar.getHeight() : 0;
        setPadding(0, topPadding, 0, 0);
    
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
    
  • 设置YouTube播放器全屏控制标志

    player.addFullscreenControlFlag(YouTubePlayer.FULLSCREEN_FLAG_CUSTOM_LAYOUT);
    
  • 处理配置更改

    <activity
        ...
        android:configChanges="keyboardHidden|orientation|screenSize"
        ...
    </activity>
    

    尝试将android:fitsSystemWindows=“true”
    添加到XML文件中的工具栏。

    我怀疑这是一个bug。我针对布局问题提交了一份新的bug报告,并在现有报告中添加了一条评论,指出SupportActionBar/工具栏被视为非法覆盖

    同时,作为解决办法,我正在做以下工作:

    版面问题

    正如特洛伊所建议的,我在工具栏XML中添加了
    android:fitsystemwindows=“true”
    。这修复了全屏显示中的布局,但导致在离开全屏时在工具栏中添加了填充()。我在
    onFullscreen(boolean)
    方法中添加了逻辑,以删除工具栏填充(
    Toolbar.setPadding(0,0,0,0)
    ),但不幸的是,这仍然显示了空白代替填充,在下次重新绘制布局时(例如,单击项目、启动播放器等)空白消失。对于如何正确设置布局/填充,我仍然有点困惑,但目前的解决方法可以解决这个问题

    非法覆盖问题

    鉴于显示工具栏将全屏暂停YouTube播放器,我添加了逻辑,仅在播放器已暂停时显示工具栏。这并不理想,因为它会强制用户暂停播放器以查看工具栏,但这是我能想到的最好的选择

    在全屏(布尔值)
    中,如果进入全屏且播放器正在播放,工具栏将隐藏

    public void onFullscreen(boolean isFullscreen) {    
        mFullscreen = isFullscreen;
    
        if (isFullscreen && youTubePlayer.isPlaying()) {
            toolbar.setVisibility(View.GONE);
        }
        else {
            toolbar.setVisibility(View.VISIBLE);
        }
    }
    
    在设置播放机时(在
    onInitializationSuccess()
    中),我添加了一个侦听器来显示和隐藏“播放和暂停”工具栏:

    youTubePlayer.setPlaybackEventListener(new YouTubePlayer.PlaybackEventListener() {
    
        ...
    
        @Override
        public void onPlaying() { 
            if (mFullscreen) {
                toolbar.setVisibility(View.GONE);
            }
        }
    
        @Override
        public void onPaused() { 
            if (mFullscreen) {
                toolbar.setVisibility(View.VISIBLE);
            }
        }
    
    });
    

    此代码将解决您的问题。 隐藏导航栏和工具栏的步骤

       public void fullScreenCall() {
        if(Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { //lower api
            View v = getActivity().getWindow().getDecorView();
            v.setSystemUiVisibility(View.GONE);
        } else if(Build.VERSION.SDK_INT >= 19) {
            //for new api versions.
            View decorView = getActivity().getWindow().getDecorView();
            int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN;
            decorView.setSystemUiVisibility(uiOptions);
        }
    }
    
    public void fullScreenCall(){
    如果(Build.VERSION.SDK_INT>11&&Build.VERSION.SDK_INT<19){//lower api
    视图v=getActivity().getWindow().getDecorView();
    v、 设置系统兼容性(View.GONE);
    }else if(Build.VERSION.SDK_INT>=19){
    //对于新的api版本。
    View decorView=getActivity().getWindow().getDecorView();
    int uiOptions=View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY|View.SYSTEM_UI_FLAG_全屏显示;
    decorView.设置系统兼容性(uiOptions);
    }
    }
    
    返回正常模式

    public void normalScreenCall() {
        if(Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api
            View v = getActivity().getWindow().getDecorView();
            v.setSystemUiVisibility(View.VISIBLE);
        } else if(Build.VERSION.SDK_INT >= 19) {
            //for new api versions.
            View decorView = getActivity().getWindow().getDecorView();
            decorView.setSystemUiVisibility(0);
        }
    }
    
    public void normalScreenCall(){
    如果(Build.VERSION.SDK_INT>11&&Build.VERSION.SDK_INT<19){//lower api
    视图v=getActivity().getWindow().getDecorView();
    v、 设置系统兼容性(视图可见);
    }else if(Build.VERSION.SDK_INT>=19){
    //对于新的api版本。
    View decorView=getActivity().getWindow().getDecorView();
    decorView.设置系统不可分割性(0);
    }
    }
    
    谢谢。这似乎解决了第一个问题(工具栏隐藏在系统UI下),但没有解决第二个问题(当工具栏位于顶部时,播放器仍会停止)。我过早地点击了send,意在添加以下内容:退出全屏模式时,它还引入了一些奇怪的行为。将
    android:fitsystemwindows=“true”
    添加到工具栏XML时,退出全屏会在工具栏顶部添加填充()。在样式中添加
    true
    时,它会在工具栏的顶部和右侧添加空白()。
       public void fullScreenCall() {
        if(Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { //lower api
            View v = getActivity().getWindow().getDecorView();
            v.setSystemUiVisibility(View.GONE);
        } else if(Build.VERSION.SDK_INT >= 19) {
            //for new api versions.
            View decorView = getActivity().getWindow().getDecorView();
            int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN;
            decorView.setSystemUiVisibility(uiOptions);
        }
    }
    
    public void normalScreenCall() {
        if(Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api
            View v = getActivity().getWindow().getDecorView();
            v.setSystemUiVisibility(View.VISIBLE);
        } else if(Build.VERSION.SDK_INT >= 19) {
            //for new api versions.
            View decorView = getActivity().getWindow().getDecorView();
            decorView.setSystemUiVisibility(0);
        }
    }