他のアイテムとはサイズが大きく形状が異なるアイテムを含むこのボトムバーを実装しようとしています。
ネイティブボトムナビゲーションコンポーネントを使用してこれを達成するための非ハッキーな方法はありますか?マテリアルデザインの仕様に準拠していないように思えるからではないでしょうか。
それ以外の場合、どのアプローチが最適ですか?これを実現する方法は2つしかありませんが、信頼できる方法はありません。
[〜#〜]編集[〜#〜]
これは、Harshitとfmaccaroniによって提案されたように、アイコンのサイズを大きくすることで得られたものです。
選択されていない場合:
アイテムを選択すると:
プロ:アイコンは他のアイコンよりも大きい
短所:それはまだ下部バーの中に含まれています。また、選択しても垂直方向の中央に配置されません
<Android.support.design.widget.BottomNavigationView
Android:id="@+id/navigation"
Android:layout_width="match_parent"
Android:layout_height="56dp"
Android:layout_alignParentBottom="true"
Android:background="?android:attr/windowBackground"
app:itemIconTint="@color/colorPrimary"
app:itemTextColor="@Android:color/black"
app:menu="@menu/navigation"
Android:clipChildren="false">
<Android.support.design.widget.FloatingActionButton
Android:id="@+id/fab"
Android:layout_width="56dp"
Android:layout_height="56dp"
Android:layout_gravity="center"
Android:layout_marginBottom="8dp"
app:elevation="6dp"
Android:scaleType="center" />
</Android.support.design.widget.BottomNavigationView>
ルートレイアウトにAndroid:clipChildren = "false"も追加します
編集:
この回答は、Material 2018の更新前に作成されました。おそらくもう行く方法ではありません。最新の資料については、DPalagiの回答を参照してください。
いくつかの調査の後、私は このライブラリ に出くわしました。彼らは私が探していたものを提供しませんでしたが、サンプルの1つに この動作 を実装しました。
これは私が彼らのアイデアを再利用することで得たものです(API 23でのみテストされました):
_<blockquote class="imgur-embed-pub" lang="en" data-id="a/0Oypk"><a href="//imgur.com/0Oypk"></a></blockquote><script async src="//s.imgur.com/min/embed.js" charset="utf-8"></script>
_
見た目はまともですが、下部のナビゲーションが2つのコンポーネントに分割されているため、この実装は好きではありません。
アイデアは、下部バーの中央に空のアイテムを作成し、その上にフローティングアクションボタンを追加して、下部バーの一部であるような錯覚を作成することです。
ここに私のボトムバーとフローティングナビゲーションボタンのレイアウトがあります:
_<com.ittianyu.bottomnavigationviewex.BottomNavigationViewEx
Android:id="@+id/navigation"
Android:layout_width="match_parent"
Android:layout_height="56dp"
Android:layout_gravity="bottom"
app:elevation="0dp"
app:itemIconTint="@drawable/menu_item_selector"
app:itemTextColor="@drawable/menu_item_selector"
app:layout_constraintBottom_toBottomOf="parent"
app:menu="@menu/navigation_items" />
<Android.support.design.widget.FloatingActionButton
Android:id="@+id/fab"
Android:layout_width="70dp"
Android:layout_height="70dp"
Android:layout_marginEnd="8dp"
Android:layout_marginStart="8dp"
Android:focusable="true"
app:backgroundTint="@color/white"
app:borderWidth="0dp"
app:elevation="0dp"
app:fabSize="mini"
app:layout_constraintBottom_toBottomOf="@id/navigation"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:srcCompat="@drawable/camera_icon" />
_
ナビゲーションバーアイテム:
_ <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools">
<item
Android:id="@+id/action_around_me"
Android:icon="@drawable/ic_bottombar_around_me"
tools:ignore="MenuTitle" />
<item
Android:id="@+id/action_my_projects"
Android:icon="@drawable/ic_bottombar_projects"
tools:ignore="MenuTitle" />
<!-- Here is the trick -->
<item
Android:id="@+id/empty"
Android:enabled="false"
tools:ignore="MenuTitle" />
<item
Android:id="@+id/action_notifications"
Android:icon="@drawable/ic_bottombar_notification"
tools:ignore="MenuTitle" />
<item
Android:id="@+id/action_settings"
Android:icon="@drawable/ic_bottombar_settings"
tools:ignore="MenuTitle" />
</menu>
_
[FAB]ボタンをクリックするたびに、下部バーを無効にします。
_private void disableBottomBar() {
Menu menu = navigationBar.getMenu();
for (int i = 0; i < menu.size(); i++) {
// The third item is a an empty item so we do not do anything on it
if (i != 2) {
menu.getItem(i).setCheckable(false);
}
}
}
_
ボトムバーのアイコンをクリックしたときのsetCheckable(true)
と同じです。
お役に立てれば。
前回のマテリアルアップデート(2018)以降、ネイティブUI要素でこれを行うことが可能です。
BottomAppBar
とapp:fabAttached
属性FloatingActionButton
with app:layout_anchor
with BottomAppBarapp:fabAlignmentMode
との連携をお楽しみくださいより多くの新しいマテリアル要素とこの要素の詳細については、 この素晴らしい中程度の記事 を参照してください。
お役に立てば幸いです。
ボトムバーナビゲーションのアイコンサイズは、プログラムで変更できます。
BottomNavigationView bottomNavigationView = (BottomNavigationView)
activity.findViewById(R.id.bottom_navigation_view);
BottomNavigationMenuView menuView = (BottomNavigationMenuView)
bottomNavigationView.getChildAt(0);
for (int i = 0; i < menuView.getChildCount(); i++) {
final View iconView =
menuView.getChildAt(i).findViewById(Android.support.design.R.id.icon);
final ViewGroup.LayoutParams layoutParams = iconView.getLayoutParams();
final DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
// set your height here
layoutParams.height = (int)
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 32, displayMetrics);
// set your width here
layoutParams.width = (int)
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 32, displayMetrics);
iconView.setLayoutParams(layoutParams);
}
このようにして、下部バーのナビゲーション項目のサイズを必要に応じて変更しました。
そして、これがあなたができることです:
クリックすると大きく表示したい同じ画像の大きなサイズの画像を取り、その描画可能なフォルダーに保存します。
以前の小さい画像を大きい画像で設定するよりも、特定の項目のナビゲーション下部バーをクリックしたときに適用されます。
そして、あなたは this library を見て、問題を解決するためにこのライブラリを使用できます。
参照として this を使用すると、BottomNavigationViewの子ごとに反復して、指定したアイテムのサイズを変更できます。
BottomNavigationView bottomNavigationView = (BottomNavigationView) activity.findViewById(R.id.bottom_navigation_view);
BottomNavigationMenuView menuView = (BottomNavigationMenuView) bottomNavigationView.getChildAt(0);
for (int i = 0; i < menuView.getChildCount(); i++) {
final View iconView = menuView.getChildAt(i).findViewById(Android.support.design.R.id.icon);
final ViewGroup.LayoutParams layoutParams = iconView.getLayoutParams();
final DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
// If it is my special menu item change the size, otherwise take other size
if (i == 2){
// set your height here
layoutParams.height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 60, displayMetrics);
// set your width here
layoutParams.width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 60, displayMetrics);
}
else {
// set your height here
layoutParams.height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 32, displayMetrics);
// set your width here
layoutParams.width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 32, displayMetrics);
}
iconView.setLayoutParams(layoutParams);
}
簡単な方法は、setScaleXとsetScaleYを使用することです。例えば:
final View iconView =
menuView.getChildAt(2).findViewById(Android.support.design.R.id.icon);
iconView.setScaleY(1.5f);
iconView.setScaleX(1.5f);