コンポーザブルは関数で定義され、@Composable
アノテーションが付けられます。
@Composable fun SimpleComposable() { Text("Hello World") }
このコンポーザブルのプレビューを有効にするには、@Composable
と @Preview
アノテーションを付けた別のコンポーザブルを作成します。この新しいアノテーション付きのコンポーザブルには、最初に作成したコンポーザブル SimpleComposable
が含まれています。
@Preview @Composable fun SimpleComposablePreview() { SimpleComposable() }
@Preview
アノテーションは、このコンポーザブルをこのファイルのデザインビューに表示する必要があることを Android Studio に伝えます。編集を行うと、コンポーザブルのプレビューのライブ更新を確認できます。
コードにパラメータを手動で追加することで、Android Studio による @Preview
のレンダリング方法をカスタマイズできます。同じ関数に @Preview
アノテーションを複数回追加して、異なるプロパティでコンポーザブルをプレビューすることもできます。
@Preview
コンポーザブルを使用する主なメリットの一つは、Android Studio でエミュレータに依存しないようにすることです。エミュレータのメモリを大量に消費する起動を保存することで、最終的な外観の変更と、@Preview
による小規模なコード変更の容易な変更とテストが可能になります。
@Preview
アノテーションを効果的に活用するには、入力として受け取る状態と出力されるイベントについて画面を定義する必要があります。
@Preview
を定義する
Android Studio には、コンポーザブルのプレビューを拡張する機能がいくつか用意されています。コンテナ デザインの変更やプレビューの操作ができるほか、プレビューをエミュレータまたはデバイスに直接デプロイすることも可能です。
サイズ
デフォルトでは、@Preview
のサイズはコンテンツをラップできるように自動的に選択されます。ディメンションを手動で設定するには、heightDp
パラメータと widthDp
パラメータを追加します。これらの値はすでに dp
として解釈されているため、.dp
を追加する必要はありません。
@Preview(widthDp = 50, heightDp = 50) @Composable fun SquareComposablePreview() { Box(Modifier.background(Color.Yellow)) { Text("Hello World") } }
ダイナミック カラーのプレビュー
アプリでダイナミック カラーを有効にしている場合は、wallpaper
属性を使用して壁紙を切り替え、ユーザーが選択した壁紙に UI がどのように反応するかを確認します。Wallpaper
クラスに用意されているさまざまな壁紙テーマから選択します。この機能には Compose 1.4.0 以降が必要です。
さまざまなデバイスで使用
Android Studio Flamingo では、Preview アノテーションの device
パラメータを編集して、さまざまなデバイスでのコンポーザブルの構成を定義できます。
デバイス パラメータに空の文字列(@Preview(device = "")
)がある場合は、Ctrl
+ Space
を押してオートコンプリートを呼び出すことができます。次に、各パラメータの値を設定します。
オートコンプリートでは、リストから任意のデバイス オプション(@Preview(device = "id:pixel_4")
など)を選択できます。または、spec:width=px,height=px,dpi=int…
を選択して各パラメータの個々の値を設定して、カスタム デバイスを入力することもできます。
適用するには Enter
を押すか、Esc
でキャンセルしてください。
無効な値を設定すると、宣言に赤の下線が表示され、修正できる場合があります(macOS の場合は Alt
+ Enter
(⌥ + ⏎)> [Replace with ...])。Inspection は、入力内容に最も近い修正を提供しようとします。
言語 / 地域
さまざまなユーザー ロケールをテストするには、locale
パラメータを追加します。
@Preview(locale = "fr-rFR") @Composable fun DifferentLocaleComposablePreview() { Text(text = stringResource(R.string.greeting)) }
背景色の設定
デフォルトでは、コンポーザブルは透明な背景で表示されます。背景を追加するには、showBackground
パラメータと backgroundColor
パラメータを追加します。backgroundColor
は Color
値ではなく ARGB Long
であることにご注意ください。
@Preview(showBackground = true, backgroundColor = 0xFF00FF00) @Composable fun WithGreenBackground() { Text("Hello World") }
システム UI
プレビュー内にステータスバーとアクションバーを表示する必要がある場合は、次のように showSystemUi
パラメータを追加します。
@Preview(showSystemUi = true) @Composable fun DecoratedComposablePreview() { Text("Hello World") }
UI モード
パラメータ uiMode
には、任意の Configuration.UI_*
定数を指定できます。これにより、プレビューの動作を適宜変更できます。たとえば、プレビューを夜間モードに設定して、テーマがどのように反応するかを確認できます。
LocalInspectionMode
LocalInspectionMode
CompositionLocal
から読み取ると、コンポーザブルがプレビュー(検査可能なコンポーネント内)でレンダリングされるかどうかを確認できます。コンポジションがプレビューでレンダリングされる場合、LocalInspectionMode.current
は true
と評価されます。この情報を使用してプレビューをカスタマイズできます。たとえば、実際のデータではなくプレースホルダ画像をプレビュー ウィンドウに表示できます。
この方法で、制限事項を回避することもできます。たとえば、ネットワーク リクエストを呼び出す代わりにサンプルデータを表示します。
@Composable fun GreetingScreen(name: String) { if (LocalInspectionMode.current) { // Show this text in a preview window: Text("Hello preview user!") } else { // Show this text in the app: Text("Hello $name!") } }
@Preview
を操作する
Android Studio には、定義したプレビューを操作する機能が用意されています。このインタラクションにより、プレビューの実行時の動作を把握でき、プレビューで UI を操作しやすくなります。
インタラクティブ モード
インタラクティブ モードを使用すると、スマートフォンやタブレットなど、プログラムを実行しているデバイスと同じようにプレビューを操作できます。インタラクティブ モードはサンドボックス環境で分離され(つまり、他のプレビューから分離)、プレビューで要素をクリックしてユーザー入力を入力できます。これにより、コンポーザブルのさまざまな状態、操作、アニメーションを簡単にテストできます。
コード ナビゲーションとコンポーザブルの枠線
プレビューにカーソルを合わせると、中に含まれるコンポーザブルの枠線が表示されます。コンポーザブルの枠線をクリックすると、エディタビューがトリガーされ、そこからコンポーザブルの定義に移動できます。
プレビューを実行
特定の @Preview
をエミュレータまたは実機で実行できます。プレビューは、新しい Activity
と同じプロジェクト アプリ内にデプロイされるため、同じコンテキストと権限を共有します。権限がすでに付与されている場合、権限を要求するボイラープレート コードを記述する必要はありません。
@Preview
アノテーションの横またはプレビューの上部にある [Run Preview] アイコン をクリックします。Android Studio によって、接続されたデバイスまたはエミュレータに @Preview
がデプロイされます。
@Preview
のレンダリングをコピーする
レンダリングされたプレビューはすべて、右クリックして画像としてコピーできます。
同じ @Preview
アノテーションの複数のプレビュー
仕様の異なる、またはコンポーザブルに異なるパラメータを渡して、同じ @Preview
コンポーザブルの複数のバージョンを表示できます。これにより、記述する必要があるボイラープレート コードを削減できます。
マルチプレビュー テンプレート
androidx.compose.ui:ui-tooling-preview
1.6.0-alpha01 以降では、マルチプレビュー API テンプレート(@PreviewScreenSizes
、@PreviewFontScales
、@PreviewLightDark
、@PreviewDynamicColors
)が導入されています。これにより、1 つのアノテーションで一般的なシナリオで Compose UI をプレビューできます。
カスタムのマルチプレビュー アノテーションを作成する
マルチプレビューでは、それ自体に構成の異なる複数の @Preview
アノテーションを含むアノテーション クラスを定義できます。このアノテーションをコンポーズ可能な関数に追加すると、さまざまなプレビューがすべて一度に自動的にレンダリングされます。たとえば、このアノテーションを使用して、コンポーザブルごとに定義を繰り返すことなく、複数のデバイス、フォントサイズ、テーマを同時にプレビューできます。
まず、独自のカスタム アノテーション クラスを作成します。
@Preview( name = "small font", group = "font scales", fontScale = 0.5f ) @Preview( name = "large font", group = "font scales", fontScale = 1.5f ) annotation class FontScalePreviews
プレビュー コンポーザブルには次のカスタム アノテーションを使用できます。
@FontScalePreviews @Composable fun HelloWorldPreview() { Text("Hello World") }
複数のマルチプレビュー アノテーションと標準プレビュー アノテーションを組み合わせて、より完全なプレビュー セットを作成できます。マルチプレビュー アノテーションを組み合わせても、すべての異なる組み合わせが表示されるわけではありません。各マルチプレビュー アノテーションは個別に動作し、独自のバリアントのみをレンダリングします。
@Preview( name = "Spanish", group = "locale", locale = "es" ) @FontScalePreviews annotation class CombinedPreviews @CombinedPreviews @Composable fun HelloWorldPreview2() { MaterialTheme { Surface { Text(stringResource(R.string.hello_world)) } } }
マルチプレビューと通常のプレビューの組み合わせにより、大規模なプロジェクトのさまざまなプロパティを包括的にテストできます。
@Preview
と大規模なデータセット
多くの場合、コンポーザブルのプレビューに大規模なデータセットを渡す必要が生じることがあります。これを行うには、@PreviewParameter
アノテーション付きのパラメータを追加して、コンポーズ可能なプレビュー関数にサンプルデータを渡します。
@Preview @Composable fun UserProfilePreview( @PreviewParameter(UserPreviewParameterProvider::class) user: User ) { UserProfile(user) }
サンプルデータを提供するには、PreviewParameterProvider
を実装し、サンプルデータをシーケンスとして返すクラスを作成します。
class UserPreviewParameterProvider : PreviewParameterProvider<User> { override val values = sequenceOf( User("Elise"), User("Frank"), User("Julia") ) }
これにより、シーケンス内のデータ要素ごとに 1 つのプレビューがレンダリングされます。
複数のプレビューに同じプロバイダ クラスを使用できます。必要に応じて、limit パラメータを設定してプレビューの数を制限します。
@Preview @Composable fun UserProfilePreview2( @PreviewParameter(UserPreviewParameterProvider::class, limit = 2) user: User ) { UserProfile(user) }
制限事項とベスト プラクティス
Android Studio は、プレビュー領域でプレビュー コードを直接実行します。Layoutlib
という Android フレームワークの移植された部分を利用するため、エミュレータや実機を実行する必要はありません。Layoutlib
は、Android デバイスの外部で実行するように設計された Android フレームワークのカスタム バージョンです。このライブラリの目的は、デバイスでのレンダリングに非常に近いレイアウトのプレビューを Android Studio で提供することです。
プレビューの制限事項
プレビューは Android Studio 内でのレンダリング方法により、軽量であり、Android フレームワーク全体を必要としません。ただし、次の制限があります。
- ネットワークにアクセスできない
- ファイルにアクセスできない
- 一部の
Context
API を使用できない可能性がある
プレビューと ViewModels
コンポーザブル内で ViewModel
を使用する場合、プレビューが制限されます。プレビュー システムでは、リポジトリ、ユースケース、マネージャーなど、ViewModel
に渡されるすべてのパラメータを構築することはできません。また、ViewModel
が(Hilt などで)依存関係インジェクションに参加している場合、プレビュー システムでは依存関係グラフ全体を作成して ViewModel
を作成することはできません。
ViewModel
でコンポーザブルをプレビューしようとすると、Android Studio で特定のコンポーザブルのレンダリング時にエラーが表示されます。
ViewModel
を使用するコンポーザブルをプレビューする場合は、ViewModel
のパラメータをコンポーザブルの引数として渡して別のコンポーザブルを作成する必要があります。これにより、ViewModel
を使用するコンポーザブルをプレビューする必要がなくなります。
@Composable
fun AuthorColumn(viewModel: AuthorViewModel = viewModel()) {
AuthorColumn(
name = viewModel.authorName,
// ViewModel sends the network requests and makes posts available as a state
posts = viewModel.posts
)
}
@Preview
@Composable
fun AuthorScreenPreview(
// You can use some sample data to preview your composable without the need to construct the ViewModel
name: String = sampleAuthor.name,
posts: List<Post> = samplePosts[sampleAuthor]
) {
AuthorColumn(...) {
name = NameLabel(name),
posts = PostsList(posts)
}
}
アノテーション クラス @Preview
Android Studio で @Preview
アノテーションを Ctrl または ⌘+クリックすることで、プレビューのカスタマイズ時に調整できるパラメータの一覧を表示できます。
annotation class Preview( val name: String = "", val group: String = "", @IntRange(from = 1) val apiLevel: Int = -1, val widthDp: Int = -1, val heightDp: Int = -1, val locale: String = "", @FloatRange(from = 0.01) val fontScale: Float = 1f, val showSystemUi: Boolean = false, val showBackground: Boolean = false, val backgroundColor: Long = 0, @UiMode val uiMode: Int = 0, @Device val device: String = Devices.DEFAULT, @Wallpaper val wallpaper: Int = Wallpapers.NONE, )
参考情報
Android Studio で @Preview
の使いやすさが促進される仕組みの詳細と、ツールに関するヒントについては、ブログの Compose ツールをご覧ください。
あなたへのおすすめ
- 注: JavaScript がオフになっている場合はリンクテキストが表示されます
- CompositionLocal でローカル スコープのデータを設定する
- Compose のマテリアル デザイン 2
- Compose でビューを使用する