1. ホーム
  2. Android

非推奨のKotlin Android Extensionsプラグインを移行する

2022-02-08 08:12:02
<パス

原文のまま 非推奨の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

原理

View Binding は、モジュール内の各XMLレイアウトに対してバインディングオブジェクトを生成します。

例えば、この ActivityMainBinding.java public final class ActivityMainBinding implements ViewBinding { @NonNull private final ConstraintLayout rootView; @NonNull public final TextView textView; View Binding レイアウトファイル

@Nullable
@NonNull