Android Привязка данных вызывает проблемы во включаемом макете - PullRequest
0 голосов
/ 17 марта 2020

Здравствуйте, надеюсь, у вас все хорошо. Я перенес свой проект из старой версии в последнюю версию, т. Е. 29. И я исправляю все ошибки. Проблема в том, что я не могу устранить ошибку панели инструментов.

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <variable
            name="controller"
            type="com.cvvm.Controller" />

        <variable
            name="menu"
            type="java.lang.Integer" />

        <variable
            name="itemClickListener"
            type="androidx.appcompat.widget.Toolbar.OnMenuItemClickListener" />

        <import type="com.bonnti.misc.NavigationClickListener" />
    </data>

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@drawable/btn_red_gradient"
        android:title="@{controller.title}"
        app:showBackButton="@{controller.previous != null}"
        app:itemClickListener="@{itemClickListener}"
        app:navigationClickListener="@{(NavigationClickListener)controller}"
        app:menu="@{menu}"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

</layout>

, и я включаю ее в другие макеты, подобные этой

 <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <variable
            name="controller"
            type="com.bonnti.screens.combthru.combthruitem.ItemCombthruController" />


        <import type="com.bonnti.R" />

        <import type="com.bonnti.misc.utils.TextUtils" />
    </data>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">


        <RelativeLayout
            android:id="@+id/toolbar_item_combthru"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <include
                layout="@layout/toolbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:controller="@{controller}" />

            <LinearLayout
                android:id="@+id/linearLayout2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:layout_marginTop="4dp"
                android:layout_marginRight="@dimen/size_2dp"
                android:clickable="true"
                android:onClick='@{controller::onThreeDotsClick}'
                android:padding="@dimen/size_10dp"
                android:visibility='@{controller.isThreeDotsVisible}'>

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginRight="6dp"
                    android:src="@drawable/ic_point_first_white" />

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginRight="6dp"
                    android:src="@drawable/ic_point"
                    android:tint="@color/white" />

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginRight="6dp"
                    android:src="@drawable/ic_point"
                    android:tint="@color/white" />

            </LinearLayout>
        </RelativeLayout>


        <include
            android:id="@+id/list"
            layout="@layout/list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/toolbar_item_combthru"
            android:layout_marginBottom="@dimen/size_40dp"
            app:adapter="@{controller.adapter}"
            app:loadMoreListener="@{controller}" />

        <RelativeLayout
            android:id="@+id/input"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:background="@color/white"
            android:padding="@dimen/size_10dp"
            android:visibility='@{controller.isCommentMode}'>

            <ImageView
                android:id="@+id/ic_im"
                android:layout_width="20dp"
                android:layout_height="20dp"
                android:scaleType="centerInside"
                app:srcCompat="@drawable/ic_combthru_comments" />

            <EditText
                android:id="@+id/et_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginLeft="@dimen/size_10dp"
                android:layout_marginRight="@dimen/size_10dp"
                android:layout_toStartOf="@+id/ic_sent"
                android:layout_toEndOf="@+id/ic_im"
                android:background="@null"
                android:hint="@string/comment"
                android:textColor="@color/textColor"
                android:textSize="@dimen/size_14sp" />

            <ImageButton
                android:id="@+id/ic_sent"
                android:layout_width="20dp"
                android:layout_height="20dp"
                android:layout_alignParentRight="true"
                android:background="@null"
                android:onClick='@{controller::sentComment}'
                android:scaleType="centerInside"
                app:srcCompat="@drawable/ic_comb_sendcomment" />
        </RelativeLayout>


    </RelativeLayout>
</layout>



public abstract class Controller<B extends ViewDataBinding> extends SerializableController<B> {
    @Override Strategy<B> createStrategy() {
        return new FragmentStrategy<>(this);
    }
}

public abstract class BonntiController<B extends ViewDataBinding> extends Controller<B> implements NavigationClickListener {
    private static final String TAG = BonntiController.class.getSimpleName();


    public void onMediaSelected(String uri) {
        // stub
        Log.w(TAG, "onMediaSelected: activity result ignored");
    }

    protected void onBroadcastReceived(Intent intent){
        // stub
        Log.w(TAG, "onBroadcastReceived: activity result ignored");
    }


    //back arrow click
    @Override public void onNavigationClick() {
        back();
    }
}


public class ItemCombthruController extends BonntiController<LayoutItemCombthruBinding> implements RemoveCommentListener,
        LoadMoreListener {

    public final Combthru combthru;
    public BaseAdapter<BaseVM> adapter = new BaseAdapter<>(new ArrayList<>());
    public ObservableBoolean isCommentMode = new ObservableBoolean();

    public ItemCombthruController(Combthru combthru) {
        Log.d("BBB", "YES!!!");
        this.combthru = combthru;
        adapter.add(new ItemCombthruTopVM(combthru, this));
        if (combthru.comments != null && combthru.comments.size() != 0) {
            for (Combthru.Comment comment : combthru.comments) {
                adapter.add(new CombthruCommentVM(this, comment, this));
            }
        }
        isCommentMode.set(true);
    }
}

Моя проблема в том, что она выдает ошибку ниже. Я пробовал все, начиная от stackoverflow (чистый проект, invaidate кэш / перезапуск, перестроить проект, включают kotlin et c), и проблема не решена. Когда я нажимаю app: controller = "@ {controller}", он говорит, что "не может найти объявление go". Любая помощь будет оценена. Заранее спасибо.

**** / ошибка привязки данных **** msg: Не удается найти установщик для атрибута «app: controller» с типом параметра com.bonnti.screens.combthru.combthruitem.ItemCombthruController в com.bonnti. databinding.ToolbarBinding. Файл: D:. \ bonnti- android -gitlab \ приложение \ SRC \ главная \ Рез \ расположение \ layout_item_combthru xml

1 Ответ

0 голосов
/ 17 марта 2020

Используйте bind пространство имен для привязки переменных. Тогда ваш root макет должен выглядеть следующим образом:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">

, а включенный должен быть

<include
   layout="@layout/toolbar"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   bind:controller="@{controller}" />

Хорошо, так что с обновленным вопросом, что я обнаружил, тип переменной controller отличается в оба макета должны быть одинаковыми.

Так что, если вы используете переменную типа com.cvvm.Controller, тогда она должна быть

<variable
        name="controller"
        type="com.cvvm.Controller" />

в обоих макетах. и ваш основной макет должен быть как

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>
    <variable name="controller" type="com.cvvm.Controller" />
</data>
..............
<include
        layout="@layout/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        bind:controller="@{controller}" />
......................

...