Android L:ActionBar setHideOnContentScrollEnabled

时间:2014-09-20 10:44:06

标签: android android-actionbar

我正在尝试在新的L API中使用setHideOnContentScrollEnabled和setHideOffset。但是,所提到的功能似乎都没有任何效果。其他人遇到过同样的问题吗?

My Activity的布局是一个ScrollView,TextView显示大量文本,因此有def滚动。根据文档的要求,我还添加了FEATURE_ACTION_BAR_OVERLAY

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

    getActionBar().setHideOnContentScrollEnabled(true);
    getActionBar().setHideOffset(40);

2 个答案:

答案 0 :(得分:3)

请注意:

  

如果启用,操作栏将与a一起向外滚动   嵌套滚动子视图的内容。

View.setNestedScrollingEnabled(布尔值)

答案 1 :(得分:0)

我遇到了同样的问题,使用RecyclerView,工具栏并尝试支持API10 +。我无法在SupportActionBar上运行 setHideOffset() setHideOnContentScrollEnabled()

在滚动工具栏后有很多不同的手动方法,这是我目前的解决方法:

我只在我的工具栏中使用ScrollView。我的Recycler处理自己正在收听的滚动。

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>

在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);
        }
    });

这会导致您的工具栏始终与Recycler中的第一个元素重叠。如果要避免这种情况,请将不可见的视图添加到具有工具栏大小的项目布局中。在你的适配器中,你只需将它设置为VISIBLE,如果它是列表中的第一个元素,或者如果它是任何其他元素则设置为GONE:

在myRecyclerItemAdapter.java中(可选):

@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);

我可能会调整OnScrollListener中的阈值dy值。它们应该过滤抖动的滚动值,例如有时会发生的-1,+ 1,-1,+的快速连续。

如果有人有更好的方法或认为我犯了大错,请告诉我!我一直在寻找更好的解决方案。