滚动时隐藏Android ActionBar

时间:2015-02-04 11:09:40

标签: android android-actionbar android-recyclerview

我想在我的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。

enter image description here

如果隐藏ActionBar,如何在右侧屏幕上删除此paddingTop?

1 个答案:

答案 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此视图顶部的偏移量(以像素为单位)   成功滑动后,进度微调器应该停止   手势。

这必须帮助你。