如何阻止此ProgressBar与工具栏一起滚动?

时间:2016-07-11 14:10:35

标签: android android-layout

有没有办法阻止此ProgressBar与工具栏一起上下滚动?现在我有两个工具栏,当RecyclerView中有项目时,它们应该向上和向下滚动,问题是当没有任何结果显示时,滚动行为会影响工具栏下方的布局。看看:

Gif showing behaviour

毋庸置疑,在任何情况下都不应滚动进度条。这是布局:

activity_base.xml

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawerLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.design.widget.AppBarLayout
            android:id="@+id/appbarLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="64dp"
                android:minHeight="64dp"
                android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
                app:layout_scrollFlags="scroll|enterAlways|snap"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbarBottom"
                android:layout_width="match_parent"
                android:layout_height="64dp"
                android:minHeight="64dp"
                android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
                android:layout_gravity="bottom"
                app:layout_scrollFlags="scroll|enterAlways|snap"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
                android:visibility="visible">

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">
                    <Spinner
                        android:id="@+id/spinner_sites"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1" />
                    <Spinner
                        android:id="@+id/spinner_sort_field"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1" />
                    <Spinner
                        android:id="@+id/spinner_sort_order"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1" />

                </LinearLayout>
            </android.support.v7.widget.Toolbar>

        </android.support.design.widget.AppBarLayout>

        <include layout="@layout/activity_masterdetail"/>

        <View
            android:id="@+id/view_search_tint"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:alpha="0.0"
            android:background="#88000000"
            android:elevation="2dp"
            android:layerType="hardware"
            android:visibility="gone" />

        <org.cryse.widget.persistentsearch.PersistentSearchView
            android:id="@+id/searchview"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:elevation="4dp"
            app:persistentSV_logoString="@string/app_name"
            app:persistentSV_searchTextColor="?android:textColorPrimary"
            app:persistentSV_editTextColor="?android:textColorPrimary"
            app:persistentSV_editHintText="Search"
            app:persistentSV_editHintTextColor="?android:textColorHint"
            app:persistentSV_displayMode="toolbar"
            app:persistentSV_homeButtonMode="burger"
            app:persistentSV_searchCardElevation="2dp"
            app:persistentSV_customToolbarHeight="64dp"
            app:layout_behavior=".ScrollingSearchViewBehavior"/>
    </android.support.design.widget.CoordinatorLayout>
</android.support.v4.widget.DrawerLayout>

包含<include layout="@layout/activity_masterdetail"/>是指向activity_fragment.xml的参考号:

<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/fragment_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

fragment_list.xml

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="visible"/>

    <!-- include pogress bar-->
    <include
        android:id="@+id/progress_bar"
        layout="@layout/progress_bar"
        android:visibility="gone" />

</RelativeLayout>

progress_bar现在只是您常规的磨机进度条运行:

<ProgressBar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.wrap_content.com/apk/res-auto"
    android:id="@+id/pbLoading"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:visibility="invisible"/>

正如您所看到的,除了SearchView之外,布局非常标准,所以我不知道为什么会出现这个问题。我发现从app:layout_behavior="@string/appbar_scrolling_view_behavior"移除activity_fragment.xml会阻止问题发生,但RecyclerView未与工具栏对齐,结果会显示在整个屏幕上,覆盖工具栏和所有。那肯定不是我想要发生的事情。

RecyclerView的可见性标记为“已消失”也会停止ProgressBar的滚动,但同样它不是集中的,这意味着问题仍然只是我不能滚动屏幕。几乎每个容器中都设置android:fitsSystemWindows="true"属性也不起作用。我已经尝试过调整几乎所有我认为没有运气的布局属性,任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

似乎我必须回答我自己的问题,这更像是一种解决方法,但确实有效。我会等待一个“实际”的答案,并在发布时将其标记为。

您需要做的是从app:layout_behavior="@string/appbar_scrolling_view_behavior"移除activity_fragment.xml属性,并在ProgressBar隐藏setVisibility(View.GONE)之后以编程方式添加该属性。每当您再次显示ProgressBar时,您还必须确保将其删除。这通常可以在Asynctask的onPostExecute()onPreExecute()方法中完成。为此,您需要保留对@+id/fragment_list片段的引用。这是代码:

View parent;
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    // keeping a reference to the @+id/fragment_list fragment
    parent = container;
    // other code
    task = new SearchResultsTask();
    task.execute();
    return view;
}

SearchResultsTask AsyncTask

@Override
protected void onPostExecute(List s) {
    super.onPostExecute(s);
    adapter.adds(s);

    progressBar.setVisibility(View.GONE);

    CoordinatorLayout.LayoutParams params =
    (CoordinatorLayout.LayoutParams) parent.getLayoutParams();
    // adding the behaviour programatically
    params.setBehavior(new AppBarLayout.ScrollingViewBehavior());
    parent.requestLayout();

    rvList.setVisibility(View.VISIBLE);
}

@Override
protected void onPreExecute() {
    super.onPreExecute();

    CoordinatorLayout.LayoutParams params =
    (CoordinatorLayout.LayoutParams) parent.getLayoutParams();
    // removing the behaviour
    params.setBehavior(null);
    parent.requestLayout();

    progressBar.setVisibility(View.VISIBLE);
}