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
690
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.7k
Push通知許諾率向上へのアプローチ
miyabigouji
1
5.1k
Suitable Notification Channel for each users
miyabigouji
0
720
持続的なサービス提供のための計測と分析
miyabigouji
0
320
Other Decks in Technology
See All in Technology
reFACToring
moznion
1
1.1k
事業成長とAI活用を止めないデータ基盤アーキテクチャの設計思想
hiracky16
1
790
StepFunctionsとGraphRAGを活用した暗黙知活用のためのRAG基盤
yakumo
1
200
『モンスターストライク』 の運営に伴走する! データ民主化への 解析グループの3つのアプローチ
mixi_engineers
PRO
0
200
Amazon Bedrock Managed Knowledge BaseDive Deep
ren8k
0
340
Data Hubグループ 紹介資料
sansan33
PRO
0
3.1k
名古屋の市バスGTFS-JPデータ×スガキヤ 最寄りバス停検索をAmazon ElastiCache Serverless for Valkeyで最適化する
usanchuu
1
110
20260722_品質と開発生産性の相互作用
magicpod
0
110
エンタープライズデータへ安全につなぐ Production-ready なエージェント設計 ― AI × MCP リファレンスアーキテクチャ ― #AIDevDay
cdataj
1
480
AI ネイティブな組織に Gemini Enterprise Agent Platform がなぜ必要なのか
asei
1
150
CloudWatchから始めるAWS監視
butadora
0
310
13年運用タイトルのサーバーサイドが辿り着いた現在地 ― モンスターストライクにおける技術・組織・AI活用から得た知見
mixi_engineers
PRO
1
400
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
67
56k
GraphQLとの向き合い方2022年版
quramy
50
15k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
400
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Evolving SEO for Evolving Search Engines
ryanjones
0
250
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
3
390
The untapped power of vector embeddings
frankvandijk
2
1.8k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
Scaling GitHub
holman
464
140k
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