我的视频活动的标题位于顶部,SeekBar
的媒体控制位于底部。当触发事件被触发时,标题和SeekBar
布局都覆盖在SurfaceView
上,并且在一定时间后消失。我还实现了沉浸式模式,其中状态和导航栏随标题和SeekBar
一起消失。我已设法为状态栏腾出空间,而不会使用以下属性覆盖标题布局。
android:fitsSystemWindows="true"
但是如果我在屏幕底部对我的媒体控件布局使用相同的属性,它就不起作用。结果导航栏覆盖在布局上。我无法弄清楚为什么上面的属性在一个布局上工作正常,而在另一个布局上却没有。我有一个媒体控件的自定义布局,我有一个扩展FrameLayout
的类。属性fitSystemWindows
不适用于自定义布局吗?请参阅第一个屏幕截图右下方的图标。它被导航栏覆盖,如第二次屏幕截图所示
我已经在下面列出了我的班级文件和布局的一部分。
MediaController.java
public class MediaController extends FrameLayout {
//Some private fields are declared here
public MediaController(Context context, boolean useFastForward, boolean useFullScreenButton) {
super(context);
....
}
public MediaController(Context context) {
this(context, true, false);
}
@Override
public void onFinishInflate() {
if (mRoot != null)
initControllerView(mRoot);
}
//Inflating the layout here
protected View makeControllerView() {
LayoutInflater inflate = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mRoot = inflate.inflate(R.layout.media_controller, null);
....
return mRoot;
}
//Lot of other methods here
}
media_controller.xml
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:fitsSystemWindows="true"> <!--Using the attribute here-->
<ImageButton android:id="@+id/pause"
android:layout_gravity="top"
android:layout_width="30dp"
android:layout_height="30dp"
android:background="@android:color/transparent"/>
<TextView android:id="@+id/time_current"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"/>
<SeekBar
android:id="@+id/mediacontroller_progress"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="32dip" />
<TextView android:id="@+id/time"
android:layout_gravity="center_horizontal"
android:textColor="@color/white"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageButton android:id="@+id/fullscreen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:contentDescription="@string/description" />
</LinearLayout>
答案 0 :(得分:1)
如果您不需要导航栏,请将其隐藏起来:
// onResume ensures that every time the application is resumed, the nav bar goes away
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
protected void onResume() {
super.onResume();
View decorView = getWindow().getDecorView();
//int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
decorView.setSystemUiVisibility(uiOptions);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
另外,请检查一下:
在Android 4.1及更高版本中,您可以将应用程序的内容设置为显示在导航栏后面,以便内容不会调整大小 当导航栏隐藏和显示。为此,请使用 SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION。您可能还需要使用 SYSTEM_UI_FLAG_LAYOUT_STABLE可帮助您的应用保持稳定 布局。
当您使用此方法时,您有责任确保 应用程序UI的关键部分最终不会被覆盖 系统栏。有关此主题的更多讨论,请参阅隐藏 状态栏课程。