Как получить <include>элемент из другого модуля с привязкой данных? - Android - PullRequest
3 голосов
/ 09 июля 2020

У меня есть два модуля: common и application1 .

common включает toolbar.xml, (который содержит кнопку) и application1 включает MainActivity и activity_main.

В activity_main.xml я хочу включить панель инструментов, которую я объявил в common . Однако, когда я пытаюсь получить доступ к кнопке на панели инструментов из MainActivity, я получаю сообщение об ошибке:

Невозможно получить доступ к com.application1.databinding.ToolbarBinding. Проверьте путь к классам модуля на отсутствие или противоречие зависимостей

Кто-нибудь знает, как это исправить? Я реализовал «общее» в gradle, но он все еще не работает. Ниже приведены мои настройки:

application1.gradle

dependencies {
    implementation project(':common')
}

common / res / layout / toolbar. xml

<androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</androidx.appcompat.widget.Toolbar>

application1 / res / layout / activity_main . xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include
        android:id="@+id/toolbar"
        android:layout="@layout/toolbar" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"                 
        android:text="Some Random Text" />

</LinearLayout>

application1 / java / MainActivity.kt

class MainActivity : AppCompatActivity() {

    private lateinit var mBinding: ActivityMainBinding
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mBinding = ActivityMainBinding.inflate(layoutInflater)
        mBinding.toolbar.button.setEnabled(true) // Cannot access 'databinding.ToolbarBinding'
        setContentView(mBinding.root)
    }

}       

Ответы [ 2 ]

0 голосов
/ 17 июля 2020

Часто привязка данных на моем ноутбуке сходит с ума и кеширует старый код. У меня это происходит, может быть, год, на многих kotlin, android студийных и градиентных версиях. Когда это происходит, я обычно выполняю одно или все из следующих действий:

./gradlew clean assembleDebug ./gradlew clean assembleDebug --no-build-cache

После завершения компиляции командной строки Android Studio снова работает.

Возможно, не указывал c на вашу проблему, если они не справляются с работой, которую я делаю ./gradlew assembleDebug --stacktrace, и внимательно читаю ошибки снизу вверх.

Конечно, вам также нужно обернуть оба макета файлы с <layout> и привязка данных включена в обоих макетах.

Если вы хотите получить доступ к объектам View вместо выполнения привязки данных, я бы рекомендовал взглянуть на https://developer.android.com/topic/libraries/view-binding, который - это недавняя реализация и, вероятно, более высокого качества, чем привязка данных, с которой довольно сложно работать, когда возникает какая-либо ошибка.

0 голосов
/ 10 июля 2020

Как получить доступ к элементу include из другого module с помощью Databinding?

Нам нужно выполнить следующие пункты для получения макета и привязки из другого module:

  1. Модуль должен быть Android Library module

  2. Этот модуль lib должен быть упомянут в файле Gradle приложения внутри зависимости как

    dependencies {
          api project(':mylibrary')
      }
    
  3. И модуль приложения, и файл gradle модуля библиотеки должны упоминать привязку данных как,

     buildFeatures {
         dataBinding true
     }
    

Затем в вашем обоих xml ставьте тег для привязки макета. Таким образом, оба xml будут такими, как показано ниже:

  1. Библиотечный модуль XML:

     <layout>
     <androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
         android:id="@+id/toolbar"
         android:layout_width="match_parent"
         android:layout_height="match_parent">
    
         <Button
             android:id="@+id/button"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content" />
    
     </androidx.appcompat.widget.Toolbar>
     </layout>
    
  2. Приложение module XML:

      <layout>
         <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:layout_width="match_parent"
         android:layout_height="match_parent">
    
           <include
             android:id="@+id/toolbar"
             layout="@layout/toolbar" />
    
           <TextView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"                 
             android:text="Some Random Text" />
    
        </LinearLayout>
     </layout>
    

Затем в своей деятельности вы можете просто получить доступ к кнопке внутри библиотеки, как показано ниже:

 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val binding: ActivityMainBinding =
            DataBindingUtil.setContentView(this, R.layout.activity_main)
        binding.toolbar.button // you can access now
    }
...