天天看點

Warning: The ‘kotlin-android-extensions‘ Gradle plugin is deprecated. Please use this migration【已解決】

Warning: The 'kotlin-android-extensions' Gradle plugin is deprecated. Please use this migration guide (https://goo.gle/kotlin-android-extensions-deprecation) to start working with View Binding (https://developer.android.com/topic/libraries/view-binding) and the 'kotlin-parcelize' plugin.

kotlin  kotlin-android-extensions棄用

參照官方文檔

視圖綁定功能可按子產品啟用。要在某個子產品中啟用視圖綁定,請将 

viewBinding

 元素添加到其 

build.gradle

 檔案中,如下例所示:

android {
        ...
        viewBinding {
            enabled = true
        }
    }
    
           

如果您希望在生成綁定類時忽略某個布局檔案,請将 

tools:viewBindingIgnore="true"

 屬性添加到相應布局檔案的根視圖中:

<LinearLayout
            ...
            tools:viewBindingIgnore="true" >
        ...
    </LinearLayout>
    
           

用法

為某個子產品啟用視圖綁定功能後,系統會為該子產品中包含的每個 XML 布局檔案生成一個綁定類。每個綁定類均包含對根視圖以及具有 ID 的所有視圖的引用。系統會通過以下方式生成綁定類的名稱:将 XML 檔案的名稱轉換為駝峰式大小寫,并在末尾添加“Binding”一詞。

例如,假設某個布局檔案的名稱為 

result_profile.xml

<LinearLayout ... >
        <TextView android:id="@+id/name" />
        <ImageView android:cropToPadding="true" />
        <Button android:id="@+id/button"
            android:background="@drawable/rounded_button" />
    </LinearLayout>
    
           
所生成的綁定類的名稱就為 ResultProfileBinding。此類具有兩個字段:一個是名為 name 的 TextView,另一個是名為 button 的 Button。該布局中的 ImageView 沒有 ID,是以綁定類中不存在對它的引用。

每個綁定類還包含一個 getRoot() 方法,用于為相應布局檔案的根視圖提供直接引用。在此示例中,ResultProfileBinding 類中的 getRoot() 方法會傳回 LinearLayout 根視圖。

以下幾個部分介紹了生成的綁定類在 Activity 和 Fragment 中的使用。

在 Activity 中使用視圖綁定
如需設定綁定類的執行個體以供 Activity 使用,請在 Activity 的 onCreate() 方法中執行以下步驟:

調用生成的綁定類中包含的靜态 inflate() 方法。此操作會建立該綁定類的執行個體以供 Activity 使用。
通過調用 getRoot() 方法或使用 Kotlin 屬性文法擷取對根視圖的引用。
将根視圖傳遞到 setContentView(),使其成為螢幕上的活動視圖。
           

 kt

private lateinit var binding: ResultProfileBinding

    override fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        binding = ResultProfileBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)
    }
    
           

 java

private ResultProfileBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ResultProfileBinding.inflate(getLayoutInflater());
        View view = binding.getRoot();
        setContentView(view);
    }
    
           

 使用

kt

binding.name.text = viewModel.name
    binding.button.setOnClickListener { viewModel.userClicked() }
    
           

java

binding.getName().setText(viewModel.getName());
    binding.button.setOnClickListener(new View.OnClickListener() {
        viewModel.userClicked()
    });