我想在我的RecyclerView上滚动时隐藏ActionBar。要做到这一点,我使用快速返回模式。
这是我的styles.xml
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="android:windowActionBarOverlay">true</item>
<!-- Support library compatibility -->
<item name="windowActionBarOverlay">true</item>
</style>
这是我的布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="?attr/actionBarSize">
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipe_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/recyclerview"/>
</android.support.v4.widget.SwipeRefreshLayout>
<include layout="@layout/empty_layout"/>
<fragment
android:id="@+id/adFragment"
android:name="com.myapp.fragment.AdFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" />
</RelativeLayout>
这是我显示/隐藏操作栏的代码
@Override
public void onUpOrCancelMotionEvent(ScrollState scrollState) {
ActionBar ab = ((ActionBarActivity)getActivity()).getSupportActionBar();
boolean tabletSize = getResources().getBoolean(R.bool.isTablet);
if (!tabletSize) {
if (scrollState == ScrollState.UP) {
if (ab.isShowing()) {
ab.hide();
}
} else if (scrollState == ScrollState.DOWN) {
if (!ab.isShowing()) {
ab.show();
}
}
}
}
我使用?attr/actionBarSize
来避免闪烁。
但是当ActionBar隐藏起来时,我仍然拥有paddingTop。
如果隐藏ActionBar,如何在右侧屏幕上删除此paddingTop?
答案 0 :(得分:2)
只需在ListView
中使用此侦听器:
AbsListView.OnScrollListener onScrollListener = new AbsListView.OnScrollListener() {
int mLastFirstVisibleItem = 0;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount,
int totalItemCount) {
final int lastItem = firstVisibleItem + visibleItemCount;
if (absListView.getId() == wallListView.getId()) {
final int currentFirstVisibleItem = wallListView.getFirstVisiblePosition();
if (currentFirstVisibleItem > mLastFirstVisibleItem) {
actionBar.hide();
} else if (currentFirstVisibleItem < mLastFirstVisibleItem) {
actionBar.show();
}
mLastFirstVisibleItem = currentFirstVisibleItem;
}
}
};
如果你的黑色区域在顶部,你必须:
在Activity
requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY); //ADD THIS BEFORE setContentView(...);
setContentView(R.layout.your_layout);
现在会很好,但你也需要设置大小等于ActionBar
的空间。我们将Header
添加到您的ListView
:
View padding = new View(getApplicationContext());
padding.setBackgroundColor(Color.TRANSPARENT);
padding.setHeight(action_bar_size);
your_list_view.addHeaderView(padding);
或者您可以在ListView
中将填充设置为XML
,但这很糟糕,因为当ActionBar
被隐藏时,空格会被切断。
如果要向SwipeRefreshLayout添加偏移量,请尝试使用:
public void setProgressViewOffset (boolean scale,int start,int end)
刷新指示器的起始和静止位置始终如此 位于清新内容的顶部附近。这个职位是 一致的位置,但可以在任何方向调整基于 是否存在工具栏或操作栏。
参数scale如果较高的z顺序没有视图,则设置为true 比将进度微调器设置为出现的位置。启动偏移量 进度微调器应该在此视图顶部的像素 出现。 end此视图顶部的偏移量(以像素为单位) 成功滑动后,进度微调器应该停止 手势。
这必须帮助你。