4

I'm trying to use the setHideOnContentScrollEnabled and setHideOffset in the new L API. However, none of the mentioned functions seem to have any effect. Anyone else encountered the same issue?

My Activity's layout is a ScrollView with a TextView displaying a large amount of text, so there are def scrolling. I have also, as required by the documentation, added FEATURE_ACTION_BAR_OVERLAY

    getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
    setContentView(R.layout.main_activity);

    getActionBar().setHideOnContentScrollEnabled(true);
    getActionBar().setHideOffset(40);
Kenneth
  • 3,957
  • 8
  • 39
  • 62
  • this will helps you : [http://stackoverflow.com/questions/13559275/hiding-the-actionbar-on-listview-scroll][1] [1]: http://stackoverflow.com/questions/13559275/hiding-the-actionbar-on-listview-scroll – Sats Sep 20 '14 at 11:09
  • No, this will not helps me. I'm trying to use the new API. But thank you for the effort! – Kenneth Sep 20 '14 at 11:12

2 Answers2

3

Notice that:

If enabled, the action bar will scroll out of sight along with a nested scrolling child view's content.

View.setNestedScrollingEnabled(boolean)

Ligboy
  • 126
  • 3
0

I was facing the same problem, using a RecyclerView, a Toolbar and trying to support API10+. I just could not get setHideOffset() or setHideOnContentScrollEnabled() on my SupportActionBar to work.

After a lot of different manual approaches on scrolling the toolbar, this is my current workaround:

I use a ScrollView only for my Toolbar. My Recycler handles its own scrolling which is being listened to.

my_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<!--The Recycler is in a RefreshLayout. This is optional.-->

<android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/swipe"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:layout_alignParentTop="true">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:scrollbars="vertical" />

</android.support.v4.widget.SwipeRefreshLayout>

<!--Draw the Recycler _below_ the Toolbar-->
<!--by defining it _before_ everything else.-->

<ScrollView
    android:id="@+id/scroll_toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:layout_alignParentTop="true"
    android:scrollbars="none">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize" />

        <!--Add a transparent View below the Toolbar
        to give the ScrollView "something to scroll".
        Make sure it is _not_ clickable.-->

        <View
            android:layout_width="match_parent"
            android:layout_height="128dp"
            android:clickable="false" />

    </RelativeLayout>

</ScrollView>

In myActivity.class

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_room_list);


    mToolbarScroller = (ScrollView) findViewById(R.id.scroll_toolbar);
    mRecycler = (RecyclerView) findViewById(R.id.recycler_rooms);
    // [...]
    // Do not forget to give your Recycler a Layout before listening to scroll events.

    mRecycler.setOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            // Only handle scrolling further if there is at least one child element in the list.
            if (recyclerView.getChildCount() == 0) {
                mSwipeLayout.setEnabled(true);
                return;
            }

            final boolean didReachTop = recyclerView.getChildAt(0).getTop() >= 0;

            if (mToolbarScroller == null) return;
            // Simply let the Toolbar follow the scrolling Recycler
            // by passing on the scroll-down (positive) values of dy.
            if (dy > 2) mToolbarScroller.scrollBy(0, dy);
            // Let the Toolbar reappear immediately
            // when scrolling up a bit or if the top has been reached.
            else if (dy < -4 || didReachTop) mToolbarScroller.scrollTo(0, 0);
        }
    });

This leads to your Toolbar always overlapping the first element in your Recycler. If you want to avoid this, add an invisible View to your item layouts that has the size of the Toolbar. In your Adapter you simply set it to VISIBLE, if it is the first element in the list, or to GONE if it is any other element:

In myRecyclerItemAdapter.java (optional):

@Override
public void onBindViewHolder(RoomViewHolder viewHolder, Cursor cursor) {
    // To compensate for the overlaying toolbar,
    // offset the first element by making its spacer visible.
    if (cursor.isFirst()) viewHolder.mSpacer.setVisibility(View.VISIBLE);
    else viewHolder.mSpacer.setVisibility(View.GONE);

I am probably going to tweak the threshold dy values in the OnScrollListener. They are supposed to filter jittery scroll values, such as a rapid succession of -1, +1, -1, +1 that sometimes happen.

If anyone has a better way or thinks I am making huge mistakes, please let me know! I am always looking for better solutions.

easytarget
  • 749
  • 9
  • 10