アクションバーとツールバー
アクションバー
アクティビティ
のタイトルやアクション
を視覚的に表現する、アプリ上部に表示されるバー。
ツールバー
アクティビティ
のタイトルやアクション
を視覚的に表現するバー。
レイアウトファイル
(=activity_main.xml
)に記述してビュー
として定義できるため、アクションバー
に比べて柔軟性に富む。
ツールバーの代用
アクションバー
の代わりに自作したツールバー
を表示する手順は、以下の通り。
アクションバー
を非表示にするレイアウトファイル
へのToolbar
タグの記述アクティビティクラス
でのツールバー
の定義
アクションバーの非表示
参考: 研修14日目(代替テーマ)
アクションバー
を非表示にする場合、テーマファイル
(=themes.xml
)で.NoActionBar
の代替テーマ
を使用する。
サンプルコード
<resources xmlns:tools="http://schemas.android.com/tools">
<style name="Theme.Toolbar"
parent="Theme.MaterialComponents.DayNight.NoActionBar">
</resources>
レイアウトファイルへの記述
ツールバー
はレイアウトファイル
(=activity_main.xml
)に<Toolbar>
タグを用いて記述する。
ただし、Android X
ライブラリに含まれるツールバー
を利用する場合、パッケージ名
を含めて記述する必要がある。
なお、標準でマテリアルデザイン
が採用されたテーマ
の設定値を属性値
として利用する場合、属性値を?attr/<テーマ属性値>
で記述する。
また、UI部品
に影をつける場合、android:elevation
属性の値を調整する。
サンプルコード
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout ...>
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:elevation="10dp"/>
...
</LinearLayout>
ツールバーの定義
レイアウトファイル
で定義したツールバー
をアクティビティ
に表示する場合は、
AppCompatActivity
クラスのsetSupportActionBar()
メソッドを用いる。
また、ロゴ
や文字列
に関する情報はレイアウト
ではないため、アクティビティクラス
で定義する必要がある。
定義
AppCompatActivity.setSupportActionBar(
@Nullable toolbar: Toolbar?
): Unit
// パラメータ
// toolbar: アクションバーとして設定するToolbarオブジェクト
サンプルコード
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Toolbar
val toolbar = findViewById<Toolbar>(R.id.toolbar)
// ロゴの表示
toolbar.setLogo(R.mipmap.ic_launcher)
// タイトルの文字列
toolbar.setTitle(R.string.toolbar_title)
// タイトルの文字色
toolbar.setTitleTextColor(Color.WHITE)
// サブタイトルの文字列
toolbar.setSubtitle(R.string.toolbar_subtitle)
// サブタイトルの文字色
toolbar.setSubtitleTextColor(Color.LTGRAY)
// ツールバーをアクションバーとして指定
setSupportActionBar(toolbar)
}
スクロールと連動するツールバーの実装
画面のスクロール
に応じて見え隠れするツールバー
を実装する手順は、以下の通り。
スクロール部分
・連動部分
の両方を<CoordinatorLayout>
タグで囲うスクロール
に連動して見え隠れするUI部品
を<AppBarLayout>
タグで囲い、UI部品
のタグにapp:layout_scrollFrags
属性を記述スクロール部分
を<NestedScrollView>
タグで囲うアクティビティクラス
でのツールバー
の定義(上記サンプルコードと同じ)
スクロール部分・連動部分全体の記述
スクロール部分
・スクロール
に連動して動く連動部分
の両方を<CoordinatorLayout>
タグで囲うことで、
UI部品
同士を連動させながらz
方向に重ねることができる。
CoordinatorLayout
UI部品
同士を連動させながらz
方向に重ねるレイアウト部品
。
ただし、スクロール部分
のUI部品
はNestedScrollingChild
インタフェースを実装したビュー
である必要がある。
FrameLayoutとCoordinatorLayout
参考: 研修1日目(レイアウト部品)
参考: FrameLayoutとCoordinatorLayout
UI部品
同士をz
方向に重ねられるレイアウト部品
であるFrameLayout
とCoordinatorLayout
の違いは、以下の通り。
レイアウト部品 | UI部品を束ねる方向 | UI部品間の連動 |
---|---|---|
FrameLayout |
z 方向 |
x |
CoordinatorLayout |
z 方向 |
o |
サンプルコード
<?xml version="1.0" encoding="utf-8"?>
<!-- CoordinatorLayout -->
<androidx.coordinatorlayout.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">
<!-- 連動部分 -->
<!-- スクロール部分 -->
</androidx.coordinatorlayout.widget.CoordinatorLayout>
連動部分の記述
連動部分
を<AppBarLayout>
タグで囲うことで、子ビュー
に対してスクロール
に連動する動きを付与することができる。
<AppBarLayout>
タグ内の子ビュー
でapp:layout_scrollFlags
属性を設定することで、
属性値に応じたモーション
を付与することができる。
ここで、app:layout_scrollFlags
属性の属性値は、scroll|<スクロールモード>
で表される。
AppBarLayout
子ビュー
に対してスクロール
に連動する動きを付与することができるレイアウト部品
。
app:layout_scrollFlags属性の属性値(=スクロールモード)
スクロール
によってツールバー
が縮小されるenterAlwaysCollapsed
モードとexitUntilCollapsed
モードについては、
連動部分
を、後述する<CollapsingToolbarLayout>
タグで囲い、
<CollapsingToolbarLayout>
タグにapp:layout_scrollFlags
属性を付与し、
連動部分
にapp:layout_collapseMode
属性を記述する必要がある。
モード | 下スクロール時の挙動 | 上スクロール時の挙動 | ツールバーのサイズ |
---|---|---|---|
enterAlways |
消失 | 出現 | 不変 |
enterAlwaysCollapsed |
消失 | 上端到達時のみ出現 | 変動 |
exitUntilCollapsed |
一部出現 | 上端到達時のみ完全に出現 | 変動 |
サンプルコード
<!-- AppBarLayout -->
<com.google.android.material.appbar.AppBarLayout
...
android:elevation="10dp">
<!-- Toolbar -->
<androidx.appcompat.widget.Toolbar
...
app:layout_scrollFlags="scroll|enterAlways"
.../>
</com.google.android.material.appbar.AppBarLayout>
スクロール部分の記述
「CoordinatorLayout
と連携するScrollView
」にあたる、
NestedScrollingChild
インタフェースを実装したNestedScrollView
を用いてスクロール部分
を記述する。
ここで、NestedScrollView
をCoordinatorLayout
と連携させるためには、
NestedScrollView
のapp:layout_behavior
属性に対して、
xmlns:app="http://schemas.android.com/apk/res-auto"
が提供する
appbar_scrolling_view_behavior
タグの属性値を付与する必要がある。
サンプルコード
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
...>
<!-- 連動部分 -->
<!-- スクロール部分 -->
<androidx.core.widget.NestedScrollView
...
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<TextView .../>
</androidx.core.widget.NestedScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
まとめ
<!-- CoordinatorLayoutでスクロール部分・連動部分を囲う -->
<CoordinatorLayout>
<!-- 連動部分 -->
<!-- 連動部分はAppBarLayoutで囲う -->
<AppBarLayout
...
android:elevation="4dp">
<Toolbar
...
app:layout_scrollFlags="scroll|enterAlways"
.../>
</AppBarLayout>
<!-- スクロール部分 -->
<!-- スクロール部分はNestedScrollViewで囲う -->
<NestedScrollView
...
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<!-- スクロールするビュー -->
</NestedScrollView>
</CoordinatorLayout>
enterAlwaysCollapsed/exitUntilCollapsedモードで動作するツールバーの実装
ツールバー
をenterAlwaysCollapsed
・exitUntilCollapse
モードで動作させる場合、
レイアウトファイル
に、ツールバー
のサイズを変動させる<CollapsingToolbarLayout>
タグを記述する必要がある。
スクロール部分
・連動部分
の両方を<CoordinatorLayout>
タグで囲うスクロール
に連動してサイズを変えながら見え隠れするUI部品
を<CollapsingToolbarLayout>
タグで囲い、<CollapsingToolbarLayout>
タグにapp:layout_scrollFrags
属性を、UI部品
のタグにapp:layout_collapseMode
属性を記述<CollapsingToolbarLayout>
タグを<AppBarLayout>
タグで囲い、<AppBarLayout>
タグでツールバー
のサイズ初期値`を定義アクティビティクラス
でのツールバー
の定義(上記サンプルコードとは異なる)スクロール部分
を<NestedScrollView>
タグで囲う
連動部分の記述
スクロール
によってツールバー
が縮小されるenterAlwaysCollapsed
モードとexitUntilCollapsed
モードについては、
連動部分
を、ツールバー
のサイズを変動させる<CollapsingToolbarLayout>
タグで囲い、
<CollapsingToolbarLayout>
タグにapp:layout_scrollFlags
属性を付与する必要がある。
また、子ビュー
に対してスクロール
に連動する動きを付与する<AppBarLayout>
タグで<CollapsingToolbarLayout>
を囲い、
<AppBarLayout>
タグでツールバー
の初期状態のサイズを指定する必要がある。
なお、exitUntilCollapsed
モードについては、サイズの縮小下限を指定するために、
<Toolbar>
タグにapp:layout_collapseMode
属性を記述する必要がある。
CollapsingToolbarLayout
スクロール
に連動してツールバー
のサイズを変更できるレイアウト部品
。
app:layout_collapseMode属性の属性値(=折りたたみモード)
属性値 | 縮小時の表示コンテンツ | 縮小中のヘッダーの挙動 |
---|---|---|
pin |
全て表示 | そのまま上方向へ移動 |
parallax |
タイトル のみ表示 |
視差方式 で上方向へ移動 |
none |
タイトル のみ表示 |
そのまま上方向へ移動 |
サンプルコード
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout ...>
<!-- 連動部分 -->
<!-- 連動部分はAppBarLayoutで囲い、サイズの初期値を記述する -->
<com.google.android.material.appbar.AppBarLayout
...
android:layout_height="180dp"
android:elevation="10dp">
<!-- 連動するビューはCollapsingToolbarLayoutで囲う -->
<com.google.android.material.appbar.CollapsingToolbarLayout
...
app:layout_scrollFlags="scroll|enterAlwaysCollapsed">
<!-- 連動するビュー -->
<androidx.appcompat.widget.Toolbar
...
app:layout_collapseMode="pin"/>
</com.google.android.material.appbar.CollapsingToolbarLayout>
</com.google.android.material.appbar.AppBarLayout>
<!-- スクロール部分 -->
</androidx.coordinatorlayout.widget.CoordinatorLayout>
ツールバーの定義
ツールバー
に表示されるコンテンツを保持するオブジェクトは、コンテンツによって以下のように異なる。
コンテンツ | 保持オブジェクト |
---|---|
ロゴ | Toolbar |
タイトル文字列 |
Toolbar および CollapsingToolbarLayout
|
タイトル文字色 | CollapsingToolbarLayout |
このため、ツールバーを定義する際はロゴ
とタイトル
で分離して定義する必要がある。
タイトル文字列
はCollapsingToolbarLayout
のtitle
プロパティ、
タイトル文字色
はCollapsingToolbarLayout
のsetExpandedTitleColor()
・setCollapsedTitleTextColor()
メソッドで定義する。
setExpandedTitleColor()
メソッドは通常時のタイトル文字色
、
setCollapsedTitleTextColor()
メソッドは縮小時のタイトル文字色
を設定する。
サンプルコード
// Toolbar
val toolbar = findViewById<Toolbar>(R.id.toolbar)
// ロゴの表示
toolbar.setLogo(R.mipmap.ic_launcher)
// ツールバーをアクションバーとして指定
setSupportActionBar(toolbar)
// CollapsingToolbarLayout
val toolbarLayout = findViewById<CollapsingToolbarLayout>(R.id.toolbarLayout)
// タイトルの文字列
toolbarLayout.title = getString(R.string.toolbar_title)
// 通常サイズ時のタイトルの文字色
toolbarLayout.setExpandedTitleColor(Color.WHITE)
// 縮小サイズ時のタイトルの文字色
toolbarLayout.setCollapsedTitleTextColor(Color.LTGRAY)
FABの実装
FAB
は、レイアウトファイル
の<CoordinatorLayout>
タグ配下に<FloatingActionButton>
タグを記述することで実装することができる。
FAB
を重ねて表示するUI部品
をapp:layout_anchor
属性で指定し、
UI部品
内でのFAB
の表示位置をapp:layout_anchorGravity
属性で指定する。
また、FAB
のアイコン
はapp:srcCompat
属性で指定できる。
FAB(Floating Action Button)
UI部品
に重なり、浮いているように表示されるボタン。
app:layout_anchorGravity属性の属性値
top/start |
top/center_horizontal |
top/end |
center_vertical/start |
center |
center_vertical/end |
bottom/start |
bottom /center_horizontal
|
bottom/end |
サンプルコード
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout ...>
<!-- FABを重ねるUI部品 -->
<!-- FAB -->
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fabEmail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="20dp"
app:layout_anchor="@id/appbar"
app:layout_anchorGravity="bottom|end"
app:srcCompat="@android:drawable/ic_dialog_email"
/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
Scrolling Activity
スクロール
を実装したアクティビティ
を作成できるプロジェクトテンプレート
。