【Android】TextField フォーカスを利用した IME 開閉が Material3 で壊れたので修正していく

Material3 に改修してみると、

こんなかんじに入力欄とIMEの挙動がおかしくなったので、

2023年8月31日以降 アプリは Android 13(API レベル 33)以降を対象にする必要があります。
2023年9月26日
Jetpack Compose Dependency versions API-33 vs API-34
2023年9月23日
メモリーリークを防ぐには欠かせない Lifecycle Observer は remove/unregister 不要
2023年9月10日
Gson が R8 で落ちる
2023年8月28日
【Kotlin DSL】Deprecated な packagingOptions が fun Packaging.() に変換される件
2023年8月27日
【Android】通知が表示されないときのアプリ別の端末設定 ON/OFF ⚙️
2023年8月25日
Missing classes detected while running R8. Please add the missing classes or apply additional keep rules that are generated in /app/build/outputs/mapping/debug/missing_rules.txt
2023年8月24日
Unresolved reference: BuildConfig
2023年8月16日
ログインに使っている Twitter (X) アカウントの連携を削除する手順
2023年8月11日
【iPhone】Yahoo天気アプリ 「現在地ボタンが変わりました」は「現在地ボタンは無くなりました」では?
2023年8月10日
【Mac】絵文字 や GitHubショートコード は「GitHub Emoji Picker」で入力する 😀
2023年8月9日
ChatGPT クローラー の UA(ユーザーエージェント) と IPアドレス範囲 まとめ
2023年8月4日
Android OS version market share
2023年7月30日
【iPhone】「パケ詰まり」「パケ止まり」を修復するショートカット 📱
2023年7月26日
Android Studio Giraffe | 2022.3.1 の dependencies の揃え方
2023年7月24日
将来、URL の twitter.com は x.com となるんだろうか。
2023年7月20日
Service Locator と DI どちらを使うか、という話。
2023年7月13日
【iPhone/Android】富士山 にいくなら「富士山」アプリ 🏔
2023年7月12日
Chromecast の 素晴らしい背景画面 をダウンロードできる件
2023年7月11日
スマホスタンド(充電不可)を作ってみたが、まあまあ使っている 📱
2023年7月10日
【Android Studio】[File] - [Project Structure] - [Suggestions] で「Update」する dependencies の妥当性 💉
2023年7月7日
【WordPress】自分のブログで「無効なトラフィック」を発生させないための Adsense タグ記述
【Jetpack Compose】TextField の フォーカス と IME 開閉 と カーソル位置

以下を元に少し見直していきます。

👉 【Jetpack Compose】TextField の フォーカス と IME 開閉 と カーソル位置 hatena-bookmark

(更新中...)


Material3 へのアップグレードで PullRefresh (SwipeRefresh) ができない件

👉 [Feature Request] PullRefreshIndicator for Material 3 [261760718] - Visible to Public - Issue Tracker hatena-bookmark

2023 年 1 月 17 日 05:01AM

accompanist/swiperefresh が非推奨になったので、M3 に実際の代替機能がないのは迷惑です。

2023年2月11日午後12時07分

こんにちは、機能リクエストありがとうございます! 返信が遅くなり申し訳ございません。現時点では、私たちの主な焦点は、PullRefreshIndicator が含まれていないマテリアル 3 デザイン仕様の内容を構築することです。これを完了した後 (今年中頃を目指しています)、データを調べて M2 PullRefresh の使用方法を学び、M3 ライブラリでのビルドの優先順位を評価します。

2023 年 3 月 21 日 12:34AM

私たちと同じように、これが人々の M2 から M3 への完全な移行を妨げる最後の問題になると思います。

2023 年 5 月 5 日 03:25AM

最新のアップデートはこちら:

M2 の pullrefresh には設計上の重大な問題がいくつかあり、このコンポーネントの M3 実装を提供することを最終的に決定する前に、この問題に対処したいと考えています。この M2 の作業が優先されると、M3 の実装に関するより具体的なタイムラインを提供できるようになります。

2023 年 8 月 8 日 09:38AM

こんにちは、いつ発売されるかについての情報はありますか?

そして現時点では、プルを使用して機能を更新するにはどうすればよいでしょうか?

2023 年 8 月 16 日 03:06AM

PullRefresh は、M2 からの既知の移行ギャップであり、現在開発中です。そのタイムラインについてはまだ正確な見積もりがありませんが、この動作のさまざまなコンポーネントが実装されるにつれて、このバグは更新されるでしょう。

現在、M3 で PullRefresh を使用する最良の方法は、その間に M2 ロジックをフォークすることです。

2023 年 8 月 22 日 09:54AM

この問題がこんなに長く続いていることに本当に驚いています。おそらく M3 はまだ準備ができていないので、アップグレードすべきではありません。

2023 年 8 月 28 日 12:17AM

Material3 にアップグレードしたかったのですが、これによってブロックされました。

2023年9月1日 08:22PM

これは私たちにとっても M3 へのアップグレードを妨げる問題です。

2023年9月23日 02:21AM

[マテリアル3][PullRefresh] PullRefreshIndicatorをM3に更新

* APIはPullRefreshState に依存しないように更新されました
* TonalElevation の動作は M3 に移植されていません
* PullRefreshIndicatorTransformation ロジックはここに移動されました
* 注: PullRefreshIndicator と PullRefreshIndicatorDefaults は、PullRefresh 動作の導入とともにパブリックとしてマークされます。

ということでもう少しかかりそうです。

とりあえず、これ、使ってみますか。

Material3 へのアップグレードで PullRefresh (SwipeRefresh) ができない件

👉 Omico/androidx-compose-material3-pullrefresh: A temporary solution for Jetpack Compose Material 3 pull refresh. hatena-bookmark


Jetpack Compose Dependency versions API-33 vs API-34

 

💻 Dependencies のバージョンがきれいに揃わない

ひとつづつ地道にバージョンを上げていったもののここまでしか上げることができない。

Jetpack Compose Dependency versions API-33 vs API-34

これ以上の安定版バージョンもすでに公開されているのだが、どうしても、

「API-33 ではこのバージョンは使えないので API-34 に上げてください」

というような SDK のバージョンアップを促されるメッセージが表示され、ビルドできない。

👉 Dependency 'androidx.emoji2:emoji2-views-helper:1.4.0' requires version 34 or later [295457468] - Visible to Public - Issue Tracker hatena-bookmark


 

💻 プロの回答

Android 14 の API 34 が完成したことにより、すべての新しい Jetpack ライブラリ リリースが API 34 でコンパイルされ始めました。つまり、アプリも API 34 でコンパイルする必要があります。targetSdk は、多くのことができるまったく異なるものであることに注意してください。


すなわち、


compileSdk 34
targetSdk 33

でビルドせろ。ということなのか。

 

💻 Android Studio Giraffe

現在の Android Studio Giraffe | 2022.3.1 では、最新のサポートする API レベルは「33」。


👉 Android Studio Giraffe | 2022.3.1  |  Android Developers hatena-bookmark

これ、34 に上げてもいいの ?

 

💻 まとめ

Jetpack ライブラリの安定版最新を使いたい場合は、

Android Studio Girrafe でなく、まだ、ベータ版の Hedgehog | 2023.1.1 を使ったほうがいいんでないの?

一見、きれいに通っているように見える。


compileSdk 34
targetSdk 34

それとも、すべて安定版のまま、我慢の開発を続けるか。

👉 JetBrains Toolbox で Android Studio の Stable/Beta/Canary が同時に管理できる? hatena-bookmark


Gson が R8 で落ちる

Gson が R8 で落ちる
Android Studio, Gradle, SDK のアップデートで避けては通れない。

いろいろ悩む前に、通信周りは R8 の変化を気にしおくといい、


# Prevent R8 from leaving Data object members always null
-keepclassmembers,allowobfuscation class * {
  @com.google.gson.annotations.SerializedName <fields>;
}

# Retain generic signatures of TypeToken and its subclasses with R8 version 3.0 and higher.
-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken
-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken

👉 gson/examples/android-proguard-example/proguard.cfg at main · google/gson hatena-bookmark

ここらは、Gson 以外の JSON パーサーにも似たようなことが言える。

Retrofit を使ってる方は、必須の注意事項。

どんなライブラリよりも先に疑った方がいい。



【Kotlin DSL】Deprecated な packagingOptions が fun Packaging.() に変換される件

これは?

【Kotlin DSL】packagingOption  が  fun Packaging.()  に変換される件

以下の記述が


packagingOptions {
  resources {
    excludes += "META-INF/rxjava.properties"
  }
}

これになりました。


fun Packaging.() {
  resources {
    excludes += "META-INF/rxjava.properties"
  }
}

なんだかおかしいです?

該当部分のコードを確認します。


    /**
     * Specifies options and rules that determine which files the Android plugin packages into your
     * APK.
     *
     * For more information about the properties you can configure in this block, see [Packaging].
     */
    @Deprecated("Renamed to packaging", replaceWith = ReplaceWith("packaging"))
    val packagingOptions: Packaging

    /**
     * Specifies options and rules that determine which files the Android plugin packages into your
     * APK.
     *
     * For more information about the properties you can configure in this block, see [Packaging].
     */
    @Deprecated("Renamed to packaging", replaceWith = ReplaceWith("packaging"))
    fun packagingOptions(action: Packaging.() -> Unit)

    /**
     * Specifies options and rules that determine which files the Android plugin packages into your
     * APK.
     *
     * For more information about the properties you can configure in this block, see [Packaging].
     */
    val packaging: Packaging

    /**
     * Specifies options and rules that determine which files the Android plugin packages into your
     * APK.
     *
     * For more information about the properties you can configure in this block, see [Packaging].
     */
    fun packaging(action: Packaging.() -> Unit)

👉 build-system/gradle-api/src/main/java/com/android/build/api/dsl/CommonExtension.kt - platform/tools/base - Git at Google hatena-bookmark

こうですね。


packaging {
  resources {
    excludes += "META-INF/rxjava.properties"
  }
}

ついでに、短くしておきます。


packaging {
  resources.excludes += "META-INF/rxjava.properties"
}

これでOK。

👉 How to replace deprecated packagingOptions in Android Gradle build files - Stack Overflow hatena-bookmark