非推奨のKotlin Android Extensionsプラグインを移行する
原文のまま
非推奨のKotlin Android Extensionsコンパイラープラグインの移行について
著者
アフマド・エル・メレジー
で Kotlin 1.4.20-M2 JetBrainsは、Kotlin Android Extensionsコンパイルプラグインを非推奨とします。
これは実は予想されていたことで、このように コミット で、詳細を見ることができます。
<ブロッククオートkotlinx.android.syntheticは推奨されなくなりました。明示的なfindViewByIdを削除しました。
でも、どうして?
kotlinxのコンポジットプロパティには、いくつかの有名な問題があります。
- ビューのidにちなんだグローバル変数を公開しますが、その名前は実際のレイアウトには関係なく、無効なルックアップに対してチェックされません。
- Kotlinのみ使用可能です。
- Views が特定の構成にのみ存在する場合、空のセキュリティ ヒントを持ちません。
- これらの問題が積み重なると、Androidアプリのクラッシュが増加します。
- また、Googleはモジュール化を推進していますが、合成のプロパティはモジュールをまたいで機能しません。これは2018年1月からの問題です 公開課題 .
代替品とは何ですか?
- ビューバインディング は、ビューの参照とバインディングのための推奨ソリューションですが、Android Kotlin Extensionsと比較していくつかのオーバーヘッドが追加されます。しかし、ビュー参照と型安全性のコンパイル時チェックが追加されます。
- 伝統的な方法であるfindViewByIdは、KotlinとJavaの両方に対応しています。
JetBrainsはKotlin Android Extensionsを非推奨とし、View Bindingの使用を推奨していますので、今回はView Bindingに移行する方法を探ります。
ビューバインディング
データバインディングと混同しないように
ビューバインディング は、ビューと対話するコードをより簡単に書くことができるようにする機能です。
を有効にすると
View Binding
は、モジュール内に存在する各XMLレイアウトファイルに対してバインディングクラスを生成します。
バインディング・クラスのインスタンスは、対応するレイアウトのIDを持つすべてのVIewへの直接参照を含んでいます。
View Binding
複数のコンフィギュレーションで定義されたレイアウトのためのヌルセーフ。
View Binding
は、ビューがある構成にしか存在しないことを検出し、その構成に対応した
@Nullable
属性で指定します。
View Binding
Java と Kotlin の場合。
View Bindingを有効にするにはどうすればよいですか?
を有効にするために、追加のライブラリーを追加する必要はありません。
View Binding
. Android Studio バージョン3.6以降、Android Gradle Pluginに組み込まれています。あなたのモジュールでこれを有効にするには、新しいビューを
build.gradle
ファイルに以下の内容で記述します。
android {
...
buildFeatures {
viewBinding true
}
}
View Bindingの使い方を教えてください。
を有効にすると
View Binding
を使用すると、モジュールに含まれる各XMLレイアウトファイルに対してバインディングクラスが生成されます。
各バインディングクラスは、ルートビューとIDを持つすべてのビューへの参照を含んでいます。
バインディング・クラスの名前は、XMLファイルの名前をキャメルケースに変換し、末尾を
Binding
という単語で生成されます。
**例えば、あるレイアウトファイルの名前が
result_profile.xml
であれば、出来上がったバインディングクラスの名前は
ResultProfileBinding
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
}
アクティビティでビューバインディングを使用する
binding
このとき
binding.name.text = "Some Text"
オブジェクトを使用してビューにアクセスします。
Fragment
フラグメントでビューバインディングを使う
でビューバインディングを使用します。
View Binding
を使用します。
onDestroy
は、適切に使用しないとメモリリークを起こす可能性があるため、注意が必要です。また、もしあなたが
private var _binding: FragmentMainBinding? = null
private val binding get() = _binding!!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?
savedInstanceState: Bundle?
): View?
_binding = FragmentMainBinding.inflate(inflater, container, false)
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
を使用すると、メモリからクリアされなくなります。
binding.name.text = "Some Text"
View Binding
そうすると、アクティビティでやったような使い方ができます。
activity_main.xml
原理
は、モジュール内の各XMLレイアウトに対してバインディングオブジェクトを生成します。
例えば、この
ActivityMainBinding.java
public final class ActivityMainBinding implements ViewBinding {
@NonNull
private final ConstraintLayout rootView;
@NonNull
public final TextView textView;
View Binding
レイアウトファイル
@Nullable
@NonNull
関連
-
Android プロジェクト コンパイル時に com.android.builder.internal.aapt.v2.Aapt2Exception に遭遇しました。AAPT2 エラー: 詳細はログを確認してください。
-
GPSプロンプトの問題は、Callがユーザーによって拒否される可能性のある許可を必要とすることです:コードは、明示的にsをチェックする必要があります。
-
ADBサーバーがACKしなかった
-
Androidで「デフォルトのアクティビティが見つからない」問題を解決する
-
RecyclerViewです。アダプタが接続されていないため、レイアウトをスキップする
-
Android Bluetooth接続
-
Android Studioの開発環境構築とAndroid Studioエミュレータの作成
-
appの実行エラー:ターゲットデバイスが見つかりませんでした。
-
Android TextViewは、あるテキストのカラー・フォント・サイズを設定する
-
android.content.res.Resources$NotFoundException: 文字列リソースID #0x1
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スレッド内にハンドラを作成できない Looper.prepare() を呼び出していないスレッド
-
AndroidStudioのコンパイル時のエラーを解決します。構成 ':classpath' のすべてのアーティファクトを解決できませんでした。
-
AndroidでSPAN_EXCLUSIVE_EXCLUSIVEスパンが長さ0にできない場合、EditTextでコンテンツを削除する
-
Eclipse &プラグインのよくある使用エラーとコンパイルエラー
-
Androidのellipsizeプロパティ(余分なテキストは楕円で表示される)
-
Android ListViewでaddHeaderを使用する
-
Manifest merger failed : Android 12以降をターゲットとするアプリは、明示的な指定が必要です。
-
Android TextViewの自動改行問題
-
android studioエミュレータの起動に失敗しました
-
Androidエラー:このターゲットで使用できるCPU/ABIシステムイメージがありません。