我正在将一个代码库从本机Holo(Theme.Holo等)移植到appcompat-v7(Theme.AppCompat等等).如果您不想阅读详细信息,最后一部分包含tl; dr.
一切正常,但我有问题复制一个很容易使用旧ActionBar的行为.我有一个视频播放器,在风景中我希望它的行为像YouTube:隐藏(动画)播放器控件,应用栏和状态栏.在用户交互时,UI控件应该保持"熄灯"模式并返回正常状态.如果用户没有触摸屏幕X秒,则计时器将返回到熄灯模式.使用ActionBar的相同代码不能用Toolbar.
所以,我使用的是:
setSystemUiVisibility() 使用以下组合之一:
View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREENView.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLEminSdkVersion 是16岁show()和hide()它Toolbar并添加了一个show()和一个hide()方法来做同样的事情(首先简单地使用setVisibility(),然后使用动画 - 得到相同的结果)在LAYOUT_STABLE做这样的appbar最终会在状态栏的背后,当然是(因为这意味着fitSystemWindows,由于appbar是视图层次结构中的普通视图和喜欢的动作条中,它是由该标志的影响是不是在装修这就是我在屏幕上看到的:

不能立即清楚工具栏界限是什么,因为应用栏在黑暗中是黑暗的,但是你可以看到标题被剪切并且"未对齐".这是因为工具栏的大小正确但位于状态栏后面.我的主要问题是,此时没有公共API来获取状态栏高度,矩形或其他任何内容以垂直移动我的应用栏以显示状态栏下方.
测试主要是在LPX13D上的N5上进行的(在撰写本文时最新的Lollipop公共版本),但在Android 4.4上也可以看到相同的情况.
也就是说,经过相当长的一段时间和一些失败的尝试使其以一种不太苛刻的方式工作(包括我自己试图将其置于装饰中的相当绝望的尝试),我采取了这种令人讨厌的方式使其工作:
在onResume:
a.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE)即使我通常不这样做也会打电话(风景)
b.注册一个OnPreDrawListener
在OnPreDrawListener:
a.使用View root = getRootView().findViewById(R.id.my_root)
b 获取根视图.获取根视图高度:( int rootTop = getAbsoluteViewTop(root) …
android media-player android-appcompat android-support-library android-toolbar
我有一个扩展ListView的自定义.列表以这样的布局定义:AdapterCursorAdapter
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
<ProgressBar
android:id="@android:id/empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/ProgressBar.Itasa.Indeterminate.Large"/>
<net.italiansubs.droitasa.widget.HookedListView
android:id="@android:id/list"
style="@style/NewsList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"/>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
该HookedListView如下所示:
package net.italiansubs.droitasa.widget;
import android.content.Context;
import android.os.Handler;
import android.util.AttributeSet;
import android.widget.ListView;
import net.italiansubs.droitasa.util.OnLayoutChangedListener;
/**
* An extended ListView that has an hook for getting layout changes.
*
* @author Sebastiano Poggi, Francesco Pontillo
*/
public class HookedListView extends ListView {
private OnLayoutChangedListener mLayoutListener;
private final Handler mHandler;
private boolean mFirstLayout = true;
public HookedListView(Context context) { …Run Code Online (Sandbox Code Playgroud)