2016-07-11 15 views
1

ProgressBarがツールバーと共に上下にスクロールされるのを防ぐ方法はありますか?今、私はRecyclerViewの項目があるときに上下にスクロールするはずの2つのツールバーを持っていますが、表示する結果がないときにスクロール動作がツールバーの下のレイアウトに影響してしまうという問題があります。見てみましょう: ProgressBarがツールバーと共にスクロールされないようにするにはどうすればよいですか?

Gif showing behaviour

言うまでもなく

と言って、プログレスバーは、どのような状況下にスクロールするべきではありません。

<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はちょうどあなたの規則的である:

activity_base.xmlザ・は<include layout="@layout/activity_masterdetail"/>含ま

<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> 

activity_fragment.xmlを指す参照です:これがレイアウトされています、r今のミルプログレスバーのUN:

<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のレイアウトはすべて、この問題が起こっているなぜ私にはわからない非常に標準である以外に見ることができるように。私は、activity_fragment.xmlからapp:layout_behavior="@string/appbar_scrolling_view_behavior"を削除すると、問題が発生しなくなりましたが、RecyclerViewがツールバーに揃えられておらず、結果が画面全体に表示され、ツールバーとすべてをカバーしています。それは確かに私が起こりたいものではありません。

RecyclerViewの表示を 'なくなった'とマークすると、ProgressBarのスクロールも停止しますが、同じことが集中されていないため、画面がスクロールできないという問題があります。ほぼすべてのコンテナにandroid:fitsSystemWindows="true"属性を設定しても機能しませんでした。私は運がないと思うほとんどすべてのレイアウト属性を調整しようとしましたが、何か助けていただければ幸いです。

+0

あなたは 'CoordinatorLayout'またはそれの' RelativeLayout'の外プログレスバーなどの外にそれを含めてみましたがありますか?あなたがスクロールすることを避けたいならば、それは 'RecyclerView'と同じ深さにすべきではありません(つまり、recyclerViewの '上にある') – Shark

+0

私はそれがアクティビティとフラグメントからでなければならないと言いますアクティビティのコールバックを使用して呼び出すことができます – xAqweRx

+0

@Shark私はそれについて考えましたが、フラグメントのレイアウト内に集中させたいのは、いくつかの解像度では2つのペインレイアウトになり、他のペインと(そして中央に)集中します。 2つのペインのGmailアプリと同様に、タブレットでも同様です。 –

答えて

0

私は自分自身の質問に答えを投稿する必要があるようですが、それは本当に回避策ではありますが、それは機能します。私は「実際の」回答を待っていて、それが投稿されたときはいつでもそれをマークします。あなたがしなければならない何

activity_fragment.xmlからapp:layout_behavior="@string/appbar_scrolling_view_behavior"属性を削除し、ProgressBarsetVisibility(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; 
} 

そしてSearchResultsTaskAsyncTask上:

@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); 
} 
関連する問題