Библиотека привязки данных при названии пакета дела верблюда - PullRequest
2 голосов
/ 30 сентября 2019

Я разрабатываю новую версию приложения для Android, которая была опубликована на рынке некоторыми предыдущими разработчиками с именем пакета, например com.mycompany.MyApp, и мне нужно использовать то же имя пакета.

В моем проекте я использовал Библиотеку привязки данных, для которой нужны имена в нижнем регистре, и я получаю "java.lang.IllegalArgumentException: не могу сделать предположение для com.mycompany.MyApp.databinding.MyFragmentRecyclerViewItemBinding"

И затем, согласно официальной документации, а также некоторым записям в SO, я поместил определение

<data class="com.mycompany.MyApp.databinding.MyFragmentRecyclerViewItemBinding" ></data> 

поверх макета в my_fragment_recycler_view_item.xml

Теперь я могу импортировать классMyFragmentRecyclerViewItemBinding в MyRecyclerViewFragment.kt и доступ к элементам представления и т. Д., Но проект не может быть скомпилирован, поскольку автоматически сгенерированный класс MyFragmentRecyclerViewItemBindingImpl не может быть скомпилирован.

Gradle выдает «java.lang.IllegalArgumentException: не может сделать предположение для com.mycompany.MyApp.databinding.MyFragmentRecyclerViewItemBindingImpl», и я вижу ошибку в классе MyFragmentRecyclerViewItemBindingImpl как «Не могу наследовать от final». mycompany.MyApp.MyFragmentRecyclerViewItemBinding '"

Я полагаю, это потому, что в Kotlin все классы являются окончательными по умолчанию, но я все равно застрял здесь. Можете ли вы что-нибудь предложить или вы видите, что я делаю неправильно?

Заранее благодарим за все прочтения, комментарии и ответы. Я не могу поделиться кодом напрямую, но символьные коды похожи на следующее:

MyRecyclerViewFragment.kt

import com.mycompany.MyApp.databinding.MyFragmentRecyclerViewItemBinding

class MyRecyclerViewFragment: Fragment()
{
 override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val fragmentIntroSlidePage = MyFragmentRecyclerViewItemBinding.inflate(inflater,
            container, false)
        //TODO ..
        return fragmentIntroSlidePage.root
    }
}

my_fragment_recycler_view_item.xml

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <data class="com.mycompany.MyApp.databinding.MyFragmentRecyclerViewItemBinding">

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/myBgColor"
        android:orientation="vertical">


        <ImageView
            android:id="@+id/slide_bg_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:contentDescription="@string/intro_slide_1_text"
            android:scaleType="fitXY"
            android:src="@drawable/intro_slide_01"
            app:layout_constraintHeight_min="150dp"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</layout>

автоматически сгенерированный класс

package com.mycompany.MyApp.databinding;

public class MyFragmentRecyclerViewItemBindingImpl extends MyFragmentRecyclerViewItemBinding  {
...

1 Ответ

0 голосов
/ 30 сентября 2019
"java.lang.IllegalArgumentException: couldn't make a guess for com.mycompany.MyApp.databinding.MyFragmentRecyclerViewItemBindingImpl"

По сути, это исключение гласит, что нельзя просто использовать заглавное имя (регистр Camel Hump) в именах пакетов для объектов, проходящих через переменную данных в привязке данных.

Поэтому решение состоит в том, чтобы сделать имя пакета в нижнем регистре, чтобы избавиться от проблемы. В случае OP это можно решить, переименовав MyApp в myapp или что-то более удобное.

Следовательно, конечный результат будет:

<data class="com.mycompany.myapp.databinding.MyFragmentRecyclerViewItemBinding">
...