AppBarLayoutの下にViewPagerがあります(ツールバーとTabLayoutを使用)。それほど大きな要素がなくても、ロードされたフラグメントの高さが使用可能なスペースを超えている理由が理解できず、タブがスクロール可能になっています。
これはメインのレイアウト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:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true">
<Android.support.design.widget.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="?attr/actionBarSize"
Android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
<Android.support.design.widget.TabLayout
Android:id="@+id/tabs"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
app:tabGravity="fill"
app:tabMode="fixed" />
</Android.support.design.widget.AppBarLayout>
<Android.support.v4.view.ViewPager
Android:id="@+id/viewpager"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</Android.support.design.widget.CoordinatorLayout>
フラグメントでわかるように、layout_alignParentBottomのボタンがありますが、ビューページャーの高さが伸びすぎていると思います。
デザインビューからのレイアウトは次のとおりです。
appBarLayoutとViewPagerの間にLinearLayoutを追加してみてください。わたしにはできる。 :)
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<Android.support.design.widget.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="?attr/actionBarSize"
Android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
<Android.support.design.widget.TabLayout
Android:id="@+id/tabs"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
app:tabMode="fixed"
app:tabGravity="fill"/>
</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" />
</LinearLayout>
padding
をViewPager
に追加すると、うまくいきました。
<Android.support.v4.view.ViewPager
Android:id="@+id/viewpager"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:paddingBottom="?attr/actionBarSize"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
パディングのサイズはツールバーのheight
とまったく同じであることに注意してください。
の代わりに ?attr/actionBarSize
、?actionBarSize
も有効です。
スクロールせずに固定ツールバーが必要な場合は、レイアウトデザインからCoordinatorLayout
とAppBarLayout
を削除し、代わりにRelativeLayout
を使用できます。これはサポートライブラリのバグであり、現在のところ解決策はありません。 ViewPager
の次のレイアウトコードをToolbar
およびTabLayout
と一緒に使用するだけです。 ViewPager
は、問題で指摘されているため、この場合はオーバーフローしません。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
tools:context=".HomeActivity">
<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"/>
<Android.support.design.widget.TabLayout
Android:id="@+id/tabs"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
app:tabIndicatorColor="@Android:color/white"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
Android:background="?attr/colorPrimary"
Android:layout_below="@id/toolbar"/>
<Android.support.v4.view.ViewPager
Android:id="@+id/container"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_below="@id/tabs"/>
</RelativeLayout>
それが誰かを助けることを願っています!
これで試してください。
ここでは、Android:fillViewport="false"
でTab Bar
プロパティを宣言する必要があります。
<Android.support.design.widget.CoordinatorLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true">
<Android.support.design.widget.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="?attr/actionBarSize"
Android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
<Android.support.design.widget.TabLayout
Android:id="@+id/tabs"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
app:tabGravity="fill"
app:tabMode="fixed" />
</Android.support.design.widget.AppBarLayout>
<Android.support.v4.view.ViewPager
Android:id="@+id/viewpager"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</Android.support.design.widget.CoordinatorLayout>
ここでTab Bar
を変更してください。
<Android.support.design.widget.TabLayout
Android:id="@+id/tabs"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:fillViewport="false" />
編集1:
これは私のために働いているものですこれを参照してください。
<?xml version="1.0" encoding="utf-8"?>
<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|snap" />
<Android.support.design.widget.TabLayout
Android:id="@+id/tabs"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:fillViewport="false" />
</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" />
</Android.support.design.widget.CoordinatorLayout>
CoordinatorLayout内で相対レイアウトを使用しました
<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">
<RelativeLayout
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:layout_scrollFlags="scroll|enterAlways|snap"
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark" />
<Android.support.design.widget.TabLayout
Android:id="@+id/tabs"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:fillViewport="false" />
</Android.support.design.widget.AppBarLayout>
<Android.support.v4.view.ViewPager
Android:id="@+id/viewpager"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_below="@id/appbar"
/>
</RelativeLayout>
</Android.support.design.widget.CoordinatorLayout>
ビューページャーウィットの動作をオーバーライドし、ビューページャーをthis.layoutsに追加します
override fun onDependentViewChanged(parent: CoordinatorLayout, child: View, dependency: View): Boolean =
super.onDependentViewChanged(parent, child, dependency).also {
layouts.forEach { it.setPadding(it.paddingLeft, it.paddingTop, it.paddingRight, it.top) }
}
TabLayoutをAppBarLayoutの外側に保持する必要があります。
このようなもの。
<Android.support.design.widget.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="?attr/actionBarSize"
Android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</Android.support.design.widget.AppBarLayout>
<Android.support.design.widget.TabLayout
Android:id="@+id/home_tab_layout"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="#ffffff"
app:tabGravity="fill"
app:tabIndicatorColor="@color/primary_blue_dark"
app:tabMode="fixed"
app:tabSelectedTextColor="@color/primary_blue"
app:tabTextColor="@color/primary_blue_light"
app:tabTextAppearance="@style/tab_layout_font_style"/>
<Android.support.v4.view.ViewPager
Android:id="@+id/home_viewpager"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_gravity="fill_horizontal"/>
これは私のために働いた。
私にとって、Viewpager layout_heightが制限内にとどまるように、Coordinator Layoutで機能した唯一のソリューションは、次のようにツールバーにlayout_behaviourを追加することでした。
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="?attr/colorPrimary"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
app:popupTheme="@style/AppTheme.AppBarOverlay">
おそらくあなたには遅すぎますが、おそらくそれは他の誰かを助けます。
アプリを起動したときは気になりませんでしたが、後で別のタブにスナックバーを追加したいときに、ページをスクロールした場合にのみスナックバーが表示されました。
変更してこの問題を解決しました
Android:layout_height="wrap_content"
Android:layout_height="0dp"
と設定
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/tl_WelcomeTabs"
viewPagerのXML属性で。 dpこの場合、match_constraintのような意味になります。
たとえば、このレイアウト:
<?xml version="1.0" encoding="utf-8"?>
<Android.support.constraint.ConstraintLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<Android.support.design.widget.TabLayout
Android:id="@+id/tl_WelcomeTabs"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="?attr/colorPrimary"
Android:elevation="6dp"
Android:minHeight="?attr/actionBarSize"
Android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
>
<Android.support.design.widget.TabItem
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Start"
/>
<Android.support.design.widget.TabItem
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Mission"
/>
</Android.support.design.widget.TabLayout>
<Android.support.v4.view.ViewPager
Android:id="@+id/vp_welcomePager"
Android:layout_width="wrap_content"
Android:layout_height="0dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/tl_WelcomeTabs"
/>
</Android.support.constraint.ConstraintLayout>
左の画像:Android:layout_height="wrap_content"
右の画像:Android:layout_height="0dp"
tldr;
変化する
Android:layout_height="wrap_content"
に
Android:layout_height="0dp"
そして、ViewPagerのXML属性にlayout_constraintBottom_toBottomOf
とlayout_constraintBottom_toBottomOf
を設定します。