2016-03-01 5 views
8

をスクロールするとき、私はグーグルでAndroidアプリをマップなどの検索バーを実装しよう:Androidのツールバーの標高

enter image description here

リサイクルビューが初期状態にあるときは、ツールバーは何の標高を持っていません。ユーザーがスクロールを開始したときにのみ、標高が表示されます。検索バー(ツールバー)が崩壊することはありません。ここで私はこれを再現しようとしたものです:

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

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recyclerView" 
     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.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="64dp"> 

      <!-- content --> 

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

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

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

そして、ここであなたが結果を確認できます。だから私の解決策の問題は、ツールバーの上昇が常に表示されていること、である

enter image description here

を。しかし、私はそれがリサイクルビューがその背後にスクロールするときだけ現れるようにしたい。 Googleマップのアプリに見られるような動作を可能にするデザインサポートライブラリはありますか?

私は私のフラグメントでRecyclerViewを持って

com.android.support:appcompat-v7:23.2.0 
com.android.support:design:23.2.0 
+0

CollapsingToolbarLayoutを使用してみましたか? –

答えて

13

あなたがCoordinatorLayoutかを使用しているかどうかは、RecyclerView.OnScrollListenerは標高が懸念している限り行くための正しい方法のように思えます。しかし、私の経験から、recyclerview.getChild(0).getTop()は信頼できず、ではなく、スクロール状態の決定にはを使用する必要があります。その代わり、これは働いているものです:

private static final int SCROLL_DIRECTION_UP = -1; 
// ... 
// Put this into your RecyclerView.OnScrollListener > onScrolled() method 
if (recyclerview.canScrollVertically(SCROLL_DIRECTION_UP) { 
    // Remove elevation 
} else { 
    // Show elevation 
} 

は割り当ててくださいLayoutManagerあなたRecyclerViewcanScrollVerticallyの呼び出しは、クラッシュの原因になります!

+1

@DanielVeihelmannは私の問題を完璧に解決してくれてありがとう。 –

3

を使用しています。私は以下のコードを使用して同様の効果を得ることができます:

これは賢明な方法ではありませんし、より良い答えを待つことができます。

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    // Initial Elevation 
    final Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar); 
    if(toolbar!= null) 
     toolbar.setElevation(0); 

    // get initial position 
    final int initialTopPosition = mRecyclerView.getTop(); 

    // Set a listener to scroll view 
    mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 

     @Override 
     public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
      super.onScrollStateChanged(recyclerView, newState); 
     } 

     @Override 
     public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
      super.onScrolled(recyclerView, dx, dy); 

      if(toolbar!= null && mRecyclerView.getChildAt(0).getTop() < initialTopPosition) { 
       toolbar.setElevation(50); 
      } else { 
       toolbar.setElevation(0); 
      } 
     } 
    }); 
} 
+0

よく見えます、ありがとう。これは単なるXMLでは不可能だと思いますか? –

+0

私はそれがXMLだけでは不可能だと思う。ツールバーのDefaultBaheviorは標高に関連していないが高さに関係している。 CoordinatorLayoutを使用する方法が見つかったとしても、コードが必要になると思います...コーディネータレイアウトだけを使用して同じ効果を得ようとしています。できるだけ早く共有します – W0rmH0le

+0

ほとんど完全、「canScrollVertically」は何ですかあなたはあなたのOnScrollListenerの中で探しています(私の答えを見てください)。 さらに、addOnScrollListener()を呼び出す前に 'toolbar == null'を返すだけで、あなたのコードは少し良くなります。 –

関連する問題