Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Androidでウィジェットサイズを固定したい時の困りごととその対処法
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
MiyabiGouji
November 21, 2024
Technology
660
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Androidでウィジェットサイズを固定したい時の困りごととその対処法
MiyabiGouji
November 21, 2024
More Decks by MiyabiGouji
See All by MiyabiGouji
Analytics-Backed App Widget Development - Served with Jetpack Glance
miyabigouji
0
1.6k
Push通知許諾率向上へのアプローチ
miyabigouji
1
5.1k
Suitable Notification Channel for each users
miyabigouji
0
710
持続的なサービス提供のための計測と分析
miyabigouji
0
310
Other Decks in Technology
See All in Technology
トークン最適化のためのユーザーストーリー分析 / User Story Analysis for Token Optimization
oomatomo
0
100
iOS アプリの「これって不具合ですか?」を AI に調べてもらう
miichan
0
150
Microsoft のサポートとフィードバック総まとめ
murachiakira
PRO
0
110
組織における AI-DLC 実践
askul
0
130
【Snowflake Summit 2026 Recap!!】Snowflake Summit Deep Dive: Security & Governance
civitaspo
1
320
LayerX コーポレートエンジニアリング室におけるサプライチェーンセキュリティへの取り組み / Supply Chain Security at LayerX Corporate Engineering
yuyatakeyama
3
850
飲食店もAIで。レジ締めやハンディシステムをつくってる話 / Using AI for restaurant management
vtryo
0
190
From Prompt Engineering to Loop Engineering
shibuiwilliam
1
260
2026-06-23 知らないままで大丈夫?開発品質・効率向上が期待できるIBM Bob便利機能6選
yutanonaka
0
120
WebGIS AI Agentの紹介
_shimizu
0
570
【FinOps】データドリブンな意思決定を目指して
z63d
2
420
ぼっちではじめた登壇が「51名」「241件」の発信に化けた
subroh0508
1
320
Featured
See All Featured
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.5k
Speed Design
sergeychernyshev
33
1.9k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
220
How to Think Like a Performance Engineer
csswizardry
28
2.7k
Documentation Writing (for coders)
carmenintech
77
5.4k
Mobile First: as difficult as doing things right
swwweet
225
10k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
HDC tutorial
michielstock
2
720
Evolving SEO for Evolving Search Engines
ryanjones
0
220
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Transcript
2024/11/21 日本経済新聞社 郷治 雅 Androidでウィジェットサイズを固定したい 時の困りごととその対処法 NIKKEI TECH TALK
ハッシュタグ #nikkei_tech_talk 名前: 郷治 雅 入社: 2016年 仕事: API開発を経てアプリチームにて日経電子版・ 紙面ビューアーのAndroidアプリを開発中
データを用いたユーザー動向分析からアプリ開発の企画や効果 検証も実施 自己紹介 2
ハッシュタグ #nikkei_tech_talk 2024年DroidKaigiにて登壇しました Jetpack Glanceを用いてウィジェットを開発する際のTipsとデータ分 析を用いたウィジェット開発から改善までの効果検証プロセスを紹介する 発表をしました。 本日はこちらのセッションのAsk the Speakerにて質
問が多かったウィジェットサイズについての課題と解決法の共有をしま す。 3
ハッシュタグ #nikkei_tech_talk 話すこと・話さないこと 話すこと • Jetpack Glanceを用いて固定サイズのウィジェットを開発し た際に直面したサイズやレイアウトに関する問題点と解決法 話さないこと •
Jetpack Glanceを用いたウィジェット開発に関する事前知識 4
ハッシュタグ #nikkei_tech_talk 2レイアウトでそれぞれ固定サイズのウィジェットを開発 • 検索 + アプリ内の4タブを開く機能のウィジェット • ウィジェットのリサイズによってレイアウトを変更し、小さい サイズの時は検索機能のみを提供
固定サイズウィジェットの要件 5 4x2 (デフォルト) 4x1
ハッシュタグ #nikkei_tech_talk 問題が起きた実装 class SearchMenuWidget : GlanceAppWidget() { override suspend
fun provideGlance(context: Context, id: GlanceId) { provideContent { Content() } } companion object { val LAYOUT_BREAKPOINT = 220.dp internal val NORMAL_SIZE = DpSize(250.dp, LAYOUT_BREAKPOINT) internal val LOW_SIZE = DpSize(250.dp, 92.dp) } 6 レイアウトが変わる縦サイズ
ハッシュタグ #nikkei_tech_talk 問題が起きた実装 @Composable private fun Content() { GlanceTheme {
when (LocalSize.current) { NORMAL_SIZE -> NormalSizeWidget(MenuItem.entries) LOW_SIZE -> LowSizeWidget() } } } override val sizeMode: SizeMode = SizeMode.Responsive( setOf(NORMAL_SIZE, LOW_SIZE), ) 7 サイズによる それぞれのレイアウト
ハッシュタグ #nikkei_tech_talk 問題が起きた実装 @Composable private fun NormalSizeWidget() { Column( modifier
= GlanceModifier .wrapContentHeight() .fillMaxWidth() .background(R.color.widget_bg) .padding(16.dp) ) { LogoAndSearch() MenuButton() ….. ウィジェット全体の padding: 16dp メニューボタン : 60dp ボタン間の padding: 12dp ウィジェット全体の高さ : 236dp 8
ハッシュタグ #nikkei_tech_talk 問題が起きた実装 @Composable private fun LowSizeWidget() { Box( modifier
= GlanceModifier .wrapContentHeight() .fillMaxWidth() .background(R.color.widget_bg) .padding(16.dp) ) { LogoAndSearch() } } ウィジェット全体の padding: 16dp メニューボタン : 60dp ウィジェット全体の高さ : 92dp 9
ハッシュタグ #nikkei_tech_talk 4x1レイアウトで横画面にすると想定より小さくなってしまう問題 困りごと① 10 画面回転直後に縦の高さが指定したコンテ ンツの高さより小さくなってしまう
ハッシュタグ #nikkei_tech_talk 困りごと①の対処法 4x1の最小サイズを用意 11 companion object { // デフォルトサイズ.
4x2 internal val MEDIUM_HEIGHT_SIZE = DpSize(250.dp, 220.dp) // 4x1 internal val SMALL_HEIGHT_SIZE = DpSize(250.dp, 92.dp) // 最小サイズ internal val X_SMALL_HEIGHT_SIZE = DpSize(250.dp, 40.dp) } 元の実装 追加の実装
ハッシュタグ #nikkei_tech_talk
ハッシュタグ #nikkei_tech_talk 文字サイズ最大時にコンテンツが見切れる端末がある 困りごと② 13 Pixel8 / API 34 文字サイズ200%
Pixel Tablet / API 34 文字サイズ200%
ハッシュタグ #nikkei_tech_talk メニューアイテム内の縦方向のpaddingを無くし、各アイテム・ ウィジェット全体の縦方向のサイズを固定 困りごと②の対処法 14 private val searchBarHeight :
Dp = 56.dp private val menuButtonHeight: Dp = 54.dp private val fullWidgetHeight: Dp = 224.dp Pixel8 / API 34 文字サイズ200% object Size { internal val FULL = DpSize(250.dp, fullWidgetHeight) internal val ONLY_SEARCH = DpSize(250.dp, 88.dp) internal val ONLY_SEARCH_SMALL = DpSize(250.dp, searchBarHeight) }
ハッシュタグ #nikkei_tech_talk 困りごと②の対処法 @Composable private fun NormalSizeWidget() { Column( modifier
= GlanceModifier .wrapContentHeight() .fillMaxWidth() .background(R.color.widget_bg) .padding(16.dp) ) { LogoAndSearch() MenuButton() ….. 15 @Composable private fun NormalSizeWidget() { Column( modifier = GlanceModifier .height(SearchMenuWidget.Size.FULL.height) .fillMaxWidth() .background(R.color.widget_bg), verticalAlignment = Alignment.CenterVertically, ) { LogoAndSearch() MenuButton() Befor e After 元の実装 高さを指定して 縦方向の中央寄せ
ハッシュタグ #nikkei_tech_talk 端末の解像度によってデフォルトレイアウトが変わってしまう 困りごと③ 16 Pixel4a
ハッシュタグ #nikkei_tech_talk ウィジェットの高さを小さめに設定 困りごと③の対処法 17 private val searchBarHeight : Dp
= 48.dp private val menuButtonHeight: Dp = 46.dp private val fullWidgetHeight: Dp = 200.dp private val searchBarHeight : Dp = 56.dp private val menuButtonHeight: Dp = 54.dp private val fullWidgetHeight: Dp = 224.dp
ハッシュタグ #nikkei_tech_talk 18 Pixel4a
ハッシュタグ #nikkei_tech_talk • 固定サイズのウィジェットを開発する際、横画面でのレイア ウト崩れに注意する必要がある • 文字サイズを最大にした時にレイアウト崩れやコンテンツ の見切れに注意する必要がある • 端末の解像度によって意図しない挙動になることがある
ためできるだけ多くの端末で検証する必要がある まとめ 19