我正在尝试使用Android M附带的DataBinding Library将事件与xml中的视图绑定.我正在关注Android开发人员的示例并逐步实现.对于视图的属性,如可见性,文本工作正常,但如果我尝试与onclick绑定,它不会按预期工作.这是我到目前为止尝试过的示例代码:
<data>
<import type="android.view.View"/>
<variable name="user" type="com.example.databinding.User"/>
<variable name="handlers" type="com.example.databinding.MyHandlers"/>
</data>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"
android:visibility="@{user.isFriend ? View.VISIBLE : View.GONE}" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click Me"
android:id="@+id/button"
android:layout_gravity="left"
android:onClick="@{handlers.onClickFriend}"/>
Run Code Online (Sandbox Code Playgroud)
主要活动 :
public class MainActivity extends AppCompatActivity {
User user;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding =
DataBindingUtil.setContentView(this,R.layout.activity_main);
user = new User("Pankaj","Kumar",true,true);
binding.setUser(user);
}
}
Run Code Online (Sandbox Code Playgroud)
MyHandlers:
public class MyHandlers {
public void onClickFriend(View view){
Log.i(MyHandlers.class.getSimpleName(),"Now Friend");
}
public void onClickEnemy(View …Run Code Online (Sandbox Code Playgroud) data-binding android android-databinding android-6.0-marshmallow
我已经实现了新的Android数据绑定,并在实现后意识到它不支持双向绑定.我试图手动解决这个问题,但我很难找到一个在绑定到EditText时使用的好解决方案.在我的布局中,我有这样的观点:
<EditText
android:id="@+id/firstname"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textCapWords|textNoSuggestions"
android:text="@{statement.firstName}"/>
Run Code Online (Sandbox Code Playgroud)
另一种观点也显示了结果:
<TextView
style="@style/Text.Large"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{statement.firstName}"/>
Run Code Online (Sandbox Code Playgroud)
在我的片段中,我创建了这样的绑定:
FragmentStatementPersonaliaBinding binding = DataBindingUtil.inflate(inflater, R.layout.fragment_statement_personalia, container, false);
binding.setStatement(mCurrentStatement);
Run Code Online (Sandbox Code Playgroud)
这样可以将firstName的当前值放在EditText中.问题是如何在文本更改时更新模型.我尝试在editText上放置一个OnTextChanged-listener并更新模型.这创建了一个循环杀死我的应用程序(模型更新更新GUI,调用textChanged时间无穷大).接下来我尝试仅在发生真实变化时通知:
@Bindable
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
boolean changed = !TextUtils.equals(this.firstName, firstName);
this.firstName = firstName;
if(changed) {
notifyPropertyChanged(BR.firstName);
}
}
Run Code Online (Sandbox Code Playgroud)
这样做效果更好,但每次我写一封信时,GUI都会更新,因为编辑光标会移到前面.
欢迎大家提出意见
我在Dialog中实现数据绑定时遇到了麻烦.可能吗?
下面是我的xml.
<data>
<variable
name="olaBooking"
type="com.example.myapp.viewmodels.ViewModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.CardView
android:id="@+id/cv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="15dp"
android:elevation="4dp"
android:padding="15dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
android:gravity="center"
android:padding="15dp"
android:text="OLA Cab Booked !"
android:textAppearance="@style/TextAppearance.AppCompat.Body1" />
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:background="@color/colorPrimaryDark" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="start|center"
android:padding="15dp"
android:text="Car Details" />
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:background="@color/colorPrimaryDark" />
<TextView
android:id="@+id/driverName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp"
android:text="@{olaBooking.driverName}" />
<TextView
android:id="@+id/carModel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp"
android:text="@{olaBooking.getCarName}" />
<TextView
android:id="@+id/carNo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp"
android:text="@{olaBooking.getCabNo}" />
<TextView
android:id="@+id/eta"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp"
android:text="@{olaBooking.getEta}" /> …Run Code Online (Sandbox Code Playgroud) 使用数据绑定时,我无法MainActivityBinding 按照数据绑定指南获取类
我的布局名称是activity_main.xml.我也看到了Android - DataBinding - 如何以及何时生成Binding类?但它无法帮助我.
根据http://developer.android.com/tools/data-binding/guide.html#imports,我们可以在可见性中使用这样简单的表达式:
<TextView
..
android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试在include标签中执行相同操作时,如下所示:
<include
android:id="@+id/image_layout"
layout="@layout/image_layout"
android:visibility="@{notification.notifType == 0 ? View.VISIBLE : View.GONE}"/>
Run Code Online (Sandbox Code Playgroud)
然后Studio不仅以红色显示表达式,而且在构建时它会在自动生成的绑定类中显示以下错误:
错误:(138,29)错误:找不到符号方法setVisibility(int)
这是自动生成的绑定类中发生错误的位置
// batch finished
if ((dirtyFlags & 0x3L) != 0) {
// api target 1
this.imageLayout.setVisibility(NotifTypeNotificatio1);
}
imageLayout.executePendingBindings();
Run Code Online (Sandbox Code Playgroud) 尝试为int创建一个@BindingConversion时遇到一个神秘的问题.
以下代码适用于浮点数到字符串:
XML:
...
<variable
name="myViewModel"
type="... .SomeModel" />
...
<TextView
style="@style/StyleStuff"
android:text="@{myViewModel.number}" />
Run Code Online (Sandbox Code Playgroud)
码:
public class SomeModel {
public ObservableFloat number = new ObservableFloat();
}
Run Code Online (Sandbox Code Playgroud)
和设置:
viewModel.number.set(3.14f);
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试对字符串进行同样的操作,我会崩溃.
public ObservableInt number = new ObservableInt();
Run Code Online (Sandbox Code Playgroud)
同
viewModel.number.set(42);
Run Code Online (Sandbox Code Playgroud)
我得到以下内容:
FATAL EXCEPTION: main
Process: ...myapplication, PID: 14311
android.content.res.Resources$NotFoundException: String resource ID #0xfa0
at android.content.res.Resources.getText(Resources.java:1123)
at android.support.v7.widget.ResourcesWrapper.getText(ResourcesWrapper.java:52)
at android.widget.TextView.setText(TextView.java:4816)
at ...executeBindings(ActivityAdaptersBinding.java:336)
at android.databinding.ViewDataBinding.executePendingBindings(ViewDataBinding.java:355)
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?谢谢!
我使用listview了以下条目属性:
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:entries="@array/fi"/>
Run Code Online (Sandbox Code Playgroud)
现在我正在将其转换为 RecyclerView
<android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Run Code Online (Sandbox Code Playgroud)
我想知道我们是否有android:entries属性RecyclerView?或者任何其他属性而不是条目?
我开始使用DataBinding功能了.我面临着问题.
错误:(21,9)错误:找不到符号类ContactListActivityBinding
build.gradle(模块:app)
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.letsnurture.ln_202.databindingdemo"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
dataBinding {
enabled = true
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
}
Run Code Online (Sandbox Code Playgroud)
ContactListActivity.java
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import com.letsnurture.ln_202.databindingdemo.model.Contact; …Run Code Online (Sandbox Code Playgroud) 在Yigit博伊尔和乔治·芒特对Android的数据绑定的谈话,他们说明它是多么容易绑定到TextWatcher的onTextChanged(在13:41).在按钮上.他们的幻灯片错了吗?首先,ButtonView没有onTextChanged属性.它既没有setOnTextChanged方法.也没有EditText.但他们都有addTextChangedListener一个TextWatcher输入.
那他们在说什么呢?他们是如何做到的呢?他们的示例代码无法编译,但会出现此错误:
Error:(17) No resource identifier found for attribute 'onTextChanged' in package 'android'
Run Code Online (Sandbox Code Playgroud)
如何使用Android Databinding框架绑定到任何View或特别是EditText上的"Text Changed Event"?
我知道可以通过资源ID引用布局中的资源:
android:text="@{@string/resourceName}"
Run Code Online (Sandbox Code Playgroud)
但是,我想通过id引用资源,这只在运行时才知道.举个简单的例子,假设我们有这样的模型:
public class MyPOJO {
public final int resourceId = R.string.helloWorld;
}
Run Code Online (Sandbox Code Playgroud)
现在我需要将此值用作格式字符串中的值.我们称之为
<string name="myFormatString">Value is: %s</string>
Run Code Online (Sandbox Code Playgroud)
最直接的方法不起作用:
android:text="@{@string/myFormatString(myPojo.resourceId)}"
Run Code Online (Sandbox Code Playgroud)
这只会将整数值放入占位符(也证明我正确初始化了我的POJO,所以我不在这里提供整个布局).
我也试过使用@BindingConversion,但它没有用(实际上是预期的,但我还是试过了) - int仍然分配给占位符并且没有调用绑定方法.
如何通过DataBinding库中的id显式获取资源?