android 数据绑定无法正常工作

2023-12-14

我想帮助解决问题。

首先,按照我的代码的详细信息:

build.gradle (Project: android)

buildscript {
    repositories {
        jcenter()
        mavenCentral()
        maven { url '/home/melti/java/repository' }
    }
    dependencies {
        classpath "com.android.tools.build:gradle:1.3.0-beta4"
        classpath "com.android.databinding:dataBinder:1.0-rc0"

    }
}

allprojects {
    repositories {
        jcenter()
        mavenCentral()
        maven { url '/home/melti/java/repository' }

    }
}

build.gradle(模块:应用程序)

apply plugin: 'com.android.application'
apply plugin: 'com.android.databinding'

android {
    compileSdkVersion 22
    buildToolsVersion "23.0.0 rc2"

    defaultConfig {
        applicationId "br.com.soma"
        minSdkVersion 16
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.0.0'
    compile 'com.android.support:recyclerview-v7:21.0.3'
    compile 'com.android.support:cardview-v7:21.0.3'
    compile 'com.squareup.picasso:picasso:2.5.2'
    compile 'com.squareup.okhttp:okhttp:2.4.0'
    compile 'com.google.code.gson:gson:2.3.1'
    compile 'org.springframework:spring-core:4.1.7.RELEASE'
    compile 'org.apache.commons:commons-io:1.3.2'


}

Amante编辑模型

package br.com.soma.amante.edit;

import android.databinding.BaseObservable;
import android.databinding.Bindable;

import br.com.soma.BR;

/**
 * Created by spassu on 09/07/15.
 */
public class AmanteEditModel extends BaseObservable {

    private String senhaConfirm;



    @Bindable
    public String getSenhaConfirm() {
        return senhaConfirm;
    }

    public void setSenhaConfirm(String senhaConfirm) {
        this.senhaConfirm = senhaConfirm;
        notifyPropertyChanged(BR.senhaConfirm);
    }
}

片段_阿曼特_编辑

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

    <data>
        <variable name="model" type="br.com.soma.amante.edit.AmanteEditModel"/>
    </data>

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

        <android.support.v7.widget.CardView
            xmlns:android="http://schemas.android.com/apk/res/android"
            style="@style/card_edit_style"
            android:layout_gravity="top"
            card_view:cardCornerRadius="0dp">


                    <EditText
                        android:id="@+id/amante_edit_senha_confirm"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center_vertical"
                        android:hint="Confirme a senha"
                        android:inputType="textPassword"
                        android:maxLines="1"
                        android:text="@{model.senhaConfirm}"
                    />

        </android.support.v7.widget.CardView>

    </ScrollView>
</layout>

Amante编辑片段

package br.com.soma.amante.edit;

import android.app.Fragment;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import br.com.soma.R;
import br.com.soma.amante.view.AmanteViewActivity;
import br.com.soma.databinding.FragmentAmanteEditBinding;

/**
 * Created by spassu on 27/05/15.
 */
public class AmanteEditFragment extends Fragment {

    private AmanteEditModel model;

    private static final String AMANTE_ID = "amanteId";
    public static final String DEFAULT_FRAGMENT_TAG = "amanteEditFragment";

    // Views
    private long amanteId;

    public AmanteEditFragment() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        model = new AmanteEditModel();
        FragmentAmanteEditBinding binding = DataBindingUtil.inflate(inflater, R.layout.fragment_amante_edit, container, false);
        binding.setModel(model);
        return binding.getRoot();
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setHasOptionsMenu(true);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.menu_amante_edit, menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()) {
            // The Save button was pressed
            case R.id.menu_amante_edit_save:
                save();
                getActivity().finish();
                return true;
            }
        return super.onOptionsItemSelected(item);
    }


    public static AmanteEditFragment newInstance(long id) {
        AmanteEditFragment fragment = new AmanteEditFragment();
        Bundle args = new Bundle();
        args.putLong(AmanteViewActivity.EXTRA_AMANTEID, id);
        fragment.setArguments(args);
        return fragment;
    }

    private void save() {
        Toast.makeText(getActivity(), model.getSenhaConfirm(), Toast.LENGTH_SHORT).show();
    }
}

输入数据后senhaConfirm并点击save(),发现绑定不起作用,即senhaConfirm into AmanteEditModel还为空。谁能帮我?


EDIT:根据 Remi David 的说法,Android Studio 现在具有两种方式的数据绑定功能。我在下面描述的解决方案应该不再是必需的。

感谢雷米指出这一点。


对于用户输入,Android 数据绑定只是一种方式。 GUI 将自动反映模型中的任何更改,但反之则不然。

您需要向模型类添加一个 TextChangeListener,以便在用户更改任何内容时设置模型属性。

例子:

public class AmanteEditModel extends BaseObservable {

    private String senhaConfirm;

    @Bindable
    public String getSenhaConfirm() {
        return senhaConfirm;
    }

    public void setSenhaConfirm(String senhaConfirm) {
        this.senhaConfirm = senhaConfirm;
        notifyPropertyChanged(BR.senhaConfirm);
    }

    // Textwatcher Reference: http://developer.android.com/reference/android/text/TextWatcher.html
    public TextWatcher getMyEditTextWatcher() {
        return new TextWatcher() {

            public void afterTextChanged(Editable s) {
            }

            public void beforeTextChanged(CharSequence s, int start,
                                          int count, int after) {
            }

            public void onTextChanged(CharSequence s, int start,
                                  int before, int count) {
                // Important! Use the property setter, otherwhise the model won't be informed about the change.
                setSenhaConfirm(s);
            }
        };
    }

}

在布局 xml 中将 EditText 更改为:

<EditText
    android:id="@+id/amante_edit_senha_confirm"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    android:hint="Confirme a senha"
    android:inputType="textPassword"
    android:maxLines="1"
    android:text="@{model.senhaConfirm}"
    app:addTextChangeListener="@{model.myEditTextWatcher}"
    />

注意命名空间添加文本更改监听器。此方法可能无法通过 android: 命名空间使用,因此我在这里使用 app: 。您还可以使用bind:使绑定更加清晰。

所以不要错过添加

xmlns:app="http://schemas.android.com/apk/res-auto"

or

xmlns:bind="http://schemas.android.com/apk/res-auto"

到您的 XML 命名空间。

如果您在模型中提供了正确的侦听器,则此解决方案适用于所有输入控件(包括自定义控件)。

文本观察器参考

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android 数据绑定无法正常工作 的相关文章

随机推荐

  • 无限水平滚动UIScrollView

    我有一个 UIScrollView 其内容大小为 1200x480 我上面有一些图像视图 其宽度加起来为 600 当向右滚动时 我只需增加内容大小并设置偏移量 以使一切变得平滑 然后我想添加其他图像 但这并不重要现在 所以基本上 当前在视口
  • 如何在没有 Ajax Toolkit 的情况下显示加载图像直到 gridview 完全加载?

    QUESTION 谁能建议如何在 gridview 完全加载之前显示加载图像 该网格视图将在页面加载时呈现 必须有一个简单的解决方案来检测 gridview 何时加载 加载 以便可以实现加载图像和 gridview 可见性之间的简单切换 请
  • Internet Explorer 8 支持 HTML 5 吗?

    IE8 是否支持 HTML5 它在 IE8 路线图上吗 IE8 beta 2 支持 HTML5 的两个 API 跨文档消息传递 and 非 SQL 存储 IE8 beta 2没有实现HTML5解析算法或新元素 没有
  • Spark:回归模型阈值和精度

    我有逻辑回归模式 我明确地将阈值设置为 0 5 model setThreshold 0 5 我训练模型 然后我想要获得基本统计数据 精确度 召回率等 这就是我评估模型时所做的 val metrics new BinaryClassific
  • Yii 迁移,未创建表

    我是 Yii 新手 仍在学习 我正在遵循书籍教程 在这里我按照书中所写创建了一个新的迁移 yiic migrate create create issue user and assignment tables 在 safeup 中我写了这个
  • LINQ 查询查找列表中的项目是否包含在另一个列表中

    我有以下代码 List
  • Java的时差[重复]

    这个问题在这里已经有答案了 为什么下面的Java代码的输出是04 18 23而不是03 18 23 public static void main String args SimpleDateFormat sdf new SimpleDat
  • 使用 getOpenFileNames 填充 QListWidget

    在下面的示例中 我想用打开 Qdialog 的文件填充我的 QListWidget 我不明白如何添加列表中选择的文件 我应该上新课吗 如何连接 setupList 和 addFiles 这两个方法 import sys from PyQt4
  • 如何将复选框添加到 uialertview 中?

    我是 iPhone 开发新手 我想在警报视图中添加一个复选框 过去两天我正在对此警报视图进行测试 但没有得到任何有效的演示项目 我正是想要这个警报框 谁能帮我 尝试使用此代码添加复选框alertview Swift let nameFiel
  • Pandas 版本之间的 MultiIndex/Reshaping 差异

    我有一个使用以下代码的 DataFrame import pandas as pd import numpy as np index pd DatetimeIndex 2017 05 04 2017 05 05 2017 05 08 201
  • Java 套接字数组

    我正在创建服务器和客户端 java 应用程序 我想创建一个数组来存储我的套接字 我正在使用 eclipse 当我输入这一行时 Socket sockets new Socket 3 Eclipse 给我一个错误 说 资源类型 Socket
  • 从主干集合中设置 Fuelux 数据网格源

    我正在尝试从我的主干集合中设置 Fuelux 数据网格源 示例来源在这里https github com ExactTarget fuelux tree master sample 我累了就像 function root factory i
  • 如何处理 pandas 中的插补和热一编码?

    我正在尝试对我的数据集应用插补和热一种编码 我知道在应用插补时 数据的维度可能会发生变化 因此我手动处理了它 该模型运行良好 但后来我决定应用热一种编码 现在 该程序无法编译 我收到尺寸不匹配错误 test X pd get dummies
  • 如何访问 subclipse 在运行时使用的 SVNClientAdapter?

    我正在使用 Subclipse API 我想实现 ISVNNotifyListener 以便我可以了解运行时发生的 subclipse 事件 我相信我需要将我的通知侦听器实例添加 订阅 到客户端适配器将通知的侦听器集 但我不知道如何访问 S
  • 我无法初始化 Google Play 游戏服务

    项目只有这段代码 我只是遵循这个描述 访问https developers google com games services android init 创建项目并添加库 google play services lib 和 BaseGam
  • 使用 Xamarin.Android 将文件上传到谷歌驱动器文件夹

    我想使用 Xamarin Andriod 在 google 驱动器 不是默认位置 的特定文件夹内创建文件 我正在使用下面的代码 MetadataChangeSet changeSetfile new MetadataChangeSet Bu
  • 在 Mac OS X 雪豹上运行 mono 2.10.2 mkbundle 时出现问题

    这一页有关于捆绑包的信息mkbundle 但是当我尝试在 Mac 上使用它时 收到此错误消息 delegate gt mkbundle delegate exe o delegate OS is Darwin Sources 1 Auto
  • Java 小程序下载文件

    我正在尝试构建一个 java 小程序 它将文件下载到客户端计算机 作为一个java应用程序 这段代码工作得很好 但是当我尝试作为一个小程序时 它什么也没做 我已签署 jar 文件 但没有收到任何安全错误消息 代码是 import java
  • 如何判断特定字体是否具有 >64k 的特定字形

    当代码点适合 64 位值时 确定特定 Unicode 字体是否包含该代码点的字形相对容易 if CTFontGetGlyphsForCharacters ctFont chars glyphs 1 It exists 但 CTFontGet
  • android 数据绑定无法正常工作

    我想帮助解决问题 首先 按照我的代码的详细信息 build gradle Project android buildscript repositories jcenter mavenCentral maven url home melti