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
MiyabiGouji
November 21, 2024
Technology
680
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
720
持続的なサービス提供のための計測と分析
miyabigouji
0
310
Other Decks in Technology
See All in Technology
書籍セキュアAPIについて
riiimparm
0
390
最高のシステムプロンプトを作るためにフィードバック機能を導入した話
alchemy1115
1
230
最新IoT事例11選に学ぶ!現場の成功パターンと実践のコツ【SORACOM Discovery 2026】
soracom
PRO
0
120
文字起こし基盤の信頼性
abnoumaru
0
150
データベース研修【MIXI 26新卒技術研修】
mixi_engineers
PRO
1
680
GMOフィナンシャルゲートが挑む、「止まらない」決済インフラ構築の裏側【SORACOM Discovery 2026】
soracom
PRO
0
110
13年運用タイトルのサーバーサイドが辿り着いた現在地 ― モンスターストライクにおける技術・組織・AI活用から得た知見
mixi_engineers
PRO
1
320
PLaMo 3.0 Primeの事後学習
pfn
PRO
0
140
ダッシュボード"開発"について 〜使われるダッシュボードのつくりかた〜
kimichan
0
240
エンタープライズデータへ安全につなぐ Production-ready なエージェント設計 ― AI × MCP リファレンスアーキテクチャ ― #AIDevDay
cdataj
1
320
Retriever と Reranker、結局どうする?
kazuaki
1
470
大 AI 時代におけるC# の事情 ~ぶっちゃけトークを交えながら~
nenonaninu
1
550
Featured
See All Featured
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Why Our Code Smells
bkeepers
PRO
340
58k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
160
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
64
56k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
190
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
Marketing to machines
jonoalderson
1
5.6k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
310
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
270
What's in a price? How to price your products and services
michaelherold
247
13k
Leo the Paperboy
mayatellez
8
1.9k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
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