通常は次のようになる新しいBottomAppBarを実装しようとしました: material BottomAppBar GoogleホームアプリのようにBottomNavigationViewとして this のように。
私の問題は、BottomAppBarをメニューリソースでのみ満たすことができるため、すべてを片側に揃えるのではなく、ボタンをBottomNavigationViewのように(ただし、Fabボタンの「カット」で)揃える方法を理解できないことです。 BottomAppBarの。
この新しいMaterial BottomAppBar内にカスタムレイアウトを追加するにはどうすればよいですか?
または代わりに、Fabボタンの「カット」を使用してBottomNavigationViewを実装する方法はありますか(新しいBottomAppBarのようなクールなデフォルトアニメーションを維持します)。
[〜#〜]解決済み[〜#〜]
基本的に、メニューリソースを必要なレイアウトに強制するのではなく、代わりにこのソリューションを使用しました。@ dglozanoが示唆するように、「空の」要素を使用してBottomAppBar内にLinearLayoutを配置するだけです。
?attr/selectableItemBackgroundBorderless
を使用すると、BottomNavigationViewと非常によく似た効果を得ることができます。
<com.google.Android.material.bottomappbar.BottomAppBar
Android:id="@+id/bar"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_gravity="bottom"
Android:gravity="center"
app:layout_anchorGravity="start"
app:hideOnScroll="true"
app:fabAnimationMode="scale"
app:fabAlignmentMode="center"
app:backgroundTint="@color/colorPrimary">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:weightSum="5"
Android:paddingEnd="16dp">
<ImageButton
Android:layout_width="0dp"
Android:layout_height="wrap_content"
Android:layout_weight="1"
app:srcCompat="@drawable/ic_home_white_24dp"
Android:background="?attr/selectableItemBackgroundBorderless"
Android:tint="@color/secondary_text"/>
<ImageButton
Android:layout_width="0dp"
Android:layout_height="wrap_content"
Android:layout_weight="1"
app:srcCompat="@drawable/ic_map_black_24dp"
Android:background="?attr/selectableItemBackgroundBorderless"/>
<ImageButton
Android:layout_width="0dp"
Android:layout_height="wrap_content"
Android:layout_weight="1"
Android:background="@Android:color/transparent"/>
<ImageButton
Android:layout_width="0dp"
Android:layout_height="wrap_content"
Android:layout_weight="1"
app:srcCompat="@drawable/ic_people_white_24dp"
Android:background="?attr/selectableItemBackgroundBorderless"/>
<ImageButton
Android:layout_width="0dp"
Android:layout_height="wrap_content"
Android:layout_weight="1"
app:srcCompat="@drawable/ic_account_circle_24dp"
Android:background="?attr/selectableItemBackgroundBorderless"/>
</LinearLayout>
</com.google.Android.material.bottomappbar.BottomAppBar>
1-build.gradle
のリポジトリにMavenを含めます
allprojects {
repositories {
jcenter()
maven {
url "https://maven.google.com"
}
}
}
2-build.gradle.
にマテリアルコンポーネントの依存関係を配置します。マテリアルバージョンは定期的に更新されます。
implementation 'com.google.Android.material:material:1.0.0-alpha1'
3-compileSdkVersionとtargetSdkVersionを最新のAPIバージョンをターゲットとするAndroid P、28に設定します。
4-BottomAppBar
に最新のスタイルを使用させるために、アプリがTheme.MaterialComponents
テーマを継承していることを確認してください。または、次のように、レイアウトxmlファイル内のウィジェット宣言でBottomAppBar
のスタイルを宣言できます。
style=”@style/Widget.MaterialComponents.BottomAppBar”
5-以下のように、レイアウトにBottomAppBarを含めることができます。 BottomAppBarはCoordinatorLayoutの子である必要があります。
<com.google.Android.material.bottomappbar.BottomAppBar
Android:id="@+id/bottom_app_bar"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_gravity="bottom"
app:backgroundTint="@color/colorPrimary"
app:fabAlignmentMode="center"
app:fabAttached="true"
app:navigationIcon="@drawable/baseline_menu_white_24"/>
6-FABのapp:layout_anchor属性でBottomAppBarのIDを指定することにより、フローティングアクションボタン(FAB)をBottomAppBarに固定できます。 BottomAppBarは、成形された背景を持つFABをクレードル化するか、FABがBottomAppBarとオーバーラップできます。
<com.google.Android.material.floatingactionbutton.FloatingActionButton
Android:id="@+id/fab"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:src="@drawable/baseline_add_white_24"
app:layout_anchor="@id/bottom_app_bar" />
7-下部ナビゲーションバーとファブアイコンを構成するために使用できる多くの属性があります。
UPDATE:チェック 特定の問題の最終的な解決策のOPの回答
これは、誰かが上記の設計を達成するのを助けるかもしれません。空のメニュー項目を追加して、fabボタンとスペースを調整します。
<androidx.coordinatorlayout.widget.CoordinatorLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@color/gray"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.google.Android.material.bottomappbar.BottomAppBar
Android:id="@+id/bottom_bar"
style="@style/AppTheme.BottomAppBar"
Android:layout_width="match_parent"
Android:layout_height="?android:attr/actionBarSize"
Android:layout_gravity="bottom"
Android:backgroundTint="@color/bottom_bar">
<com.google.Android.material.bottomnavigation.BottomNavigationView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="@Android:color/transparent"
app:itemIconTint="@color/white"
app:labelVisibilityMode="unlabeled"
app:menu="@menu/bottom_menu">
</com.google.Android.material.bottomnavigation.BottomNavigationView>
</com.google.Android.material.bottomappbar.BottomAppBar>
<com.google.Android.material.floatingactionbutton.FloatingActionButton
Android:id="@+id/fab_button"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:backgroundTint="@color/bottom_bar"
Android:src="@drawable/ic_plus"
Android:visibility="visible"
app:borderWidth="0dp"
app:fabAlignmentMode="end"
app:fabCradleMargin="20dp"
app:fabSize="normal"
app:layout_anchor="@id/bottom_bar"
app:maxImageSize="38dp"
app:tint="@color/white">
</com.google.Android.material.floatingactionbutton.FloatingActionButton>
透明な背景を持つbottomNavigationViewの下にbottomAppBarを配置します。空のメニュー項目をmenu.xmlに追加して、FABのスペースを解放します。
XML:
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/lt_content"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@color/white"
Android:fitsSystemWindows="false">
<ViewPager
Android:id="@+id/main_pager"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_marginBottom="56dp"
Android:layout_above="@+id/bottom_navigation"
Android:layout_alignParentStart="true" />
<com.google.Android.material.bottomnavigation.BottomNavigationView
Android:id="@+id/bottom_navigation"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
app:labelVisibilityMode="labeled"
Android:layout_gravity="bottom"
Android:layout_alignParentBottom="true"
Android:background="@color/transparent"
app:menu="@menu/bottom_menu" />
<com.google.Android.material.bottomappbar.BottomAppBar
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:id="@+id/bottom_bar"
Android:layout_gravity="bottom"/>
<com.google.Android.material.floatingactionbutton.FloatingActionButton
Android:id="@+id/fab"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
app:layout_anchor="@id/bottom_bar"/>