Android 数据绑定(bind) - 无法调用点击处理程序

标签 android event-handling android-databinding

我使用数据绑定(bind)创建了一个简单的登录屏幕,如 http://developer.android.com/tools/data-binding/guide.html 中所述但是我无法收到从

更改文本的通知
  1. 文本框或
  2. 点击按钮。

我认为对于文本框通知,android 团队可能没有完全实现它。但是,我无法理解我对按钮单击处理程序的错误。

fragment 代码看起来像

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    FragmentAccountSetupInitialBinding binding = DataBindingUtil.inflate(inflater, R.layout.fragment_account_setup_initial, container, false);
    View view = binding.getRoot();

    binding.setAccount(new UserAccount());
    return view;
}

用户帐户的 ViewModel 定义如下

public class UserAccount extends BaseObservable {
    private String _email;
    private String _password;

    @Bindable
    public String getEmail() {
        return _email;
    }

    public void setEmail(String email) {
        if(!TextUtils.equals(_email, email)) {
            _email= email;
            notifyPropertyChanged(BR.email);
        }
    }


    @Bindable
    public String getPassword() {
        return _password;
    }

    public void setPassword(String password) {
        if(!TextUtils.equals(_password, password)) {
            _password = password;
            notifyPropertyChanged(BR.password);
        }
    }

    public void onSignInButtonClick(View view) {
        // Sign in now
    }
}

fragment 布局是

<layout
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable name="account" type="project.namespace.UserAccount"/>
    </data>
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingTop="56dp"
            android:paddingLeft="24dp"
            android:paddingRight="24dp">

            <!-- Email Label -->
            <android.support.design.widget.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:layout_marginBottom="8dp">
                <android.support.design.widget.TextInputEditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="textEmailAddress"
                    android:hint="@string/email"
                    android:text="@{account.email}"/>
            </android.support.design.widget.TextInputLayout>

            <!-- Password Label -->
            <android.support.design.widget.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:layout_marginBottom="8dp">
                <android.support.design.widget.TextInputEditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="textPassword"
                    android:hint="@string/password"
                    android:text="@{account.password}"/>
            </android.support.design.widget.TextInputLayout>


            <android.support.v7.widget.AppCompatButton
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="24dp"
                android:layout_marginBottom="24dp"
                android:padding="12dp"
                android:text="@string/signin"
                android:onClick="@{account.onSignInButtonClick}"/>

        </LinearLayout>

    </FrameLayout>
</layout>

更新

移动到 android studio 2.1 beta 2 解决了第一个问题。更新布局如下

<android.support.design.widget.TextInputEditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="textEmailAddress"
    android:hint="@string/email"
    android:text="@={account.email}"/>

最佳答案

你能为你的按钮尝试以下吗?

<android.support.v7.widget.AppCompatButton
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="24dp"
            android:layout_marginBottom="24dp"
            android:padding="12dp"
            android:text="@string/signin"
            android:onClick="@{account::onSignInButtonClick}"/>

我在 IDE 上遇到错误('!=', '%'... expected, got ':')但它在应用程序运行时有效...重要的部分是“::”。

希望对你有帮助!

关于Android 数据绑定(bind) - 无法调用点击处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36684797/

相关文章:

events - OpenLayers 3 捕捉瓷砖加载事件

vb.net - 您如何在自己的类(class)中处理类(class)中提出的事件?

android - MVVM-包含布局内的 Recyclerview 从未初始化

java - Android 的线程和进度对话框

android - 无法检测到奥利奥的来电

android - XML 布局不合作

java - 带有 org.threeten.bp.OffsetDateTime 的 Android 数据绑定(bind)格式化程序

android - MediaPlayer.setVolume() 函数似乎不起作用

JavaScript - 检测文本区域的变化

android - 找不到 Gradle DSL 方法 : 'dataBinding()'