新しく発表された Android Design Support Library からCoordinatorLayout
を実装しようとしていますが、サンプルのようにXMLレイアウトで次のコードを使用しました ここ :
<Android.support.design.widget.CoordinatorLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/main_content"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<Android.support.design.widget.AppBarLayout
Android:id="@+id/appbar"
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="?attr/actionBarSize"
Android:background="?attr/colorPrimary"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:layout_scrollFlags="scroll|enterAlways"/>
<Android.support.design.widget.TabLayout
Android:id="@+id/tabs"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"/>
</Android.support.design.widget.AppBarLayout>
<Android.support.v4.view.ViewPager
Android:id="@+id/viewpager"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
ただし、ビューを下にスクロールしてもアクションバーは非表示になりません。なぜこれが機能しないのか理解できません。
編集:私が知る限り、CoordinatorLayout
はListView/GridView/ScrollViews
では機能せず、RecyclerView
とNestedScrollView
でのみ機能するようです。残念ながら、これらのビューの1つに切り替えるだけでは不可能なので、まだ解決策を探しています。
ListView
にScrollingView
とNestedScrollingChild
の両方のインターフェースを実装させる必要があると思います。
これは簡単なことではありませんが、RecyclerView
のソースコードを見ればできるはずです。 NestedScrollingChildHelper
を利用しており、同じことができるはずです。
現在、すべてのビューがCoordinatorLayout
で期待される動作をするわけではありません。
ビューはNestedScrollView
インターフェースを実装し、ネストされたスクロールイベントを処理する必要があります。
RecyclerView
とNestedScrollView
(バージョン22)は、この動作をサポートしています。ただし、AbsListView
(ListView
およびGridView
)も使用できますが、API21 +でのみ使用できます。
次のようなものを追加するだけです。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
listView.setNestedScrollingEnabled(true);
}
ビューは、CoordinatorLayout.DefaultBehavior(YourView.Behavior.class)アノテーションを使用してデフォルトの動作を宣言するか、app:layout_behavior = "com.example.app.YourView $ Behavior"属性を使用してレイアウトファイルに設定できます。このフレームワークにより、任意のビューをCoordinatorLayoutと統合できます。
したがって、ここでの解決策はAppBarLayout.Behaviorクラスをオーバーライドすることだと思います
ViewPager
に何を表示しているかによって異なります。 list/recyclerviewを使用すると、正しくスクロールするはずです。