1. 程式人生 > >DataBinding 填坑總結

DataBinding 填坑總結

Problem 1:

根據提示檢視xml檔案的157行:

<.custom.CenteredIconButton
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="@string/already_friends"
                        android:textColor="@color/primary"
                        android:drawableStart="@drawable/selector_ic_check"
                        android:drawablePadding="@dimen/activity_vertical_margin_half"
                        android:visibility="@{viewModel.isFriend.get ? View.VISIBLE : View.GONE}"
                        android:onClick="@{viewModel.changeFriendshipStatus}"
                        style="@style/Widget.AppCompat.Button.Borderless"/>
這裡是一個自定義佈局,它告訴我
android:onClick="@{viewModel.changeFriendshipStatus}"  
changeFriendshipStatus方法沒找到所以不能解析,檢查之後才發現是包名寫錯了,多寫了一個點
.custom.CenteredIconButton    應該替換為 custom.CenteredIconButton;要仔細。

Problem 2:

還是看下程式碼:

<ProgressBar
                    android:layout_width="0dp"
                    android:layout_height="@dimen/small_progressbar_size"
                    android:layout_weight="1"
                    android:layout_gravity="center"
                    android:visibility="@{!viewModel.isLoaded.get}"/>
看出問題了嗎?
android:visibility="@{!viewModel.isLoaded.get}"應該修改為
android:visibility="@{!viewModel.isLoaded.get ? View.VISIBLE : View.GONE}"

Problem 3 :


佈局檔案:

<android.support.design.widget.FloatingActionButton
            android:id="@+id/fab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|end"
            app:srcCompat="@drawable/ic_edit"
            app:layout_behavior="custom.ScrollAwareFABBehavior"
            app:onClick="@{viewModel.edit}"
            style="@style/FAB"/>

ViewModel中的方法:

 /**
     * Fab 按鈕點選事件
     */
    public void edit() {
        AppUtilities.showInputDialog(context, status);
    }
這有什麼問題?乍看之下無比正常,其實應該把
app:onClick="@{viewModel.edit}" 替換成 android:onClick="@{viewModel.edit}"

Problem 4:



新的風暴已經出現,怎麼能夠挺住不前

這是因為 自己定義的方法的方法簽名必須與實際的listener回撥方法的簽名保持一致 (即方法的引數型別與個數要一致);也就是說edit()和OnClick()引數不一致。我們給FAB控制元件新增點選事件時都是 

fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              ...
            }
        });

所以我們應該把

 /**
     * Fab 按鈕點選事件
     */
    public void edit() {
        AppUtilities.showInputDialog(context, status);
    }

替換為加上View引數

 /**
     * Fab 按鈕點選事件
     */
    public void edit(View view) {
        AppUtilities.showInputDialog(context, status);
    }

problem 5:

新增一行import,引入View進來:

<data>
        <import type="android.view.View" />
        <variable
            name="employee"
            type="com.example.Employee"/>
    </data>

以上問題都是親測有效。