Скрытие Android ActionBar при прокрутке

Я хочу скрыть ActionBar при прокрутке моего RecyclerView. Для этого я использую шаблон быстрого возврата.

Вот мои стили.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.

введите здесь описание изображения

Как я могу удалить этот paddingTop на правом экране, когда панель действий скрыта?


person guillaume    schedule 04.02.2015    source источник


Ответы (1)


Просто используйте этот слушатель в вашем 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 (логическая шкала, int start, int end)

Начальная и конечная позиция индикатора обновления всегда располагается в верхней части обновляемого содержимого. Это положение является постоянным, но его можно изменить в любом направлении в зависимости от того, присутствует ли панель инструментов или панель действий.

Масштаб параметров Установите в значение true, если нет представления в более высоком z-порядке, чем то, где установлен счетчик прогресса. start Смещение в пикселях от верхней части этого представления, при котором должен появиться счетчик прогресса. end Смещение в пикселях от верхней части этого вида, на котором счетчик прогресса должен остановиться после успешного жеста смахивания.

Это должно вам помочь.

person GIGAMOLE    schedule 04.02.2015
comment
Я уже реализовал отображение/скрытие, но когда панель действий скрывается, появляется пустое пространство, как вы можете видеть на правом снимке экрана. И я хочу удалить это пустое место, когда панель действий скрыта - person guillaume; 04.02.2015
comment
У меня тоже была эта идея, но поскольку я использую SwipeRefreshLayout, когда я тяну для обновления, анимация обновления скрыта. Есть ли способ добавить paddingTop к этой анимации? - person guillaume; 04.02.2015
comment
Оууу. У меня была аналогичная проблема. - person GIGAMOLE; 04.02.2015
comment
setProgressViewOffset делает свою работу! В сочетании с stackoverflow.com/questions/26858692/ Я могу установить смещение по высоте панели действий. спасибо - person guillaume; 04.02.2015