我的ObservableBoolean活动类中有一个字段,它绑定到我ToggleButton喜欢的"checked"属性:
android:checked="@{activity.editing}"
Run Code Online (Sandbox Code Playgroud)
我希望这会在按钮和布尔值之间创建双向关系,但它只会从字段到按钮进行更改,而不是相反.我做错了什么,或者这不在Android的范围内DataBinding?
我正在使用android的数据绑定库来查看库项目中的视图
我在根gradle文件中添加了以下行
classpath 'com.android.databinding:dataBinder:1.0-rc1'
Run Code Online (Sandbox Code Playgroud)
并在模块的gradle文件中启用了dataBinding,如下所示
apply plugin: 'com.android.databinding'
...
...
android {
....
dataBinding {
enabled = true
}
}
Run Code Online (Sandbox Code Playgroud)
我已经在我的库项目中以及使用此库的主机应用程序中启用了multiDex但是在启动库的活动时我得到了这个堆栈的错误跟踪
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/databinding/DataBinderMapper;
at android.databinding.DataBindingUtil.<clinit>(DataBindingUtil.java:31)
at sdk.ui.activities.MyActivity.onCreate(MyActivity.java:76)
at android.app.Activity.performCreate(Activity.java:6280)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1116)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2534)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2647)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1502)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5763)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:888)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:749)
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.databinding.DataBinderMapper" on path: DexPathList[[zip file "/data/app/testApp.dev-1/base.apk"],nativeLibraryDirectories=[/data/app/testApp.dev-1/lib/arm64, /data/app/testApp.dev-1/base.apk!/lib/arm64-v8a, /vendor/lib64, /system/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at android.databinding.DataBindingUtil.<clinit>(DataBindingUtil.java:31) …Run Code Online (Sandbox Code Playgroud) 随着Android体系结构组件的稳定,我开始将所有基本ViewModel的更新到新的实现ViewModel.根据我的理解,LiveData建议使用它来保存Model类,因为它更好地处理生命周期.
我喜欢使用Data Binding它,因为它使代码在Java/Kotlin方面更清晰,并且不需要"观察"值更改来更新UI.但是,Data Binding如果Model(或ViewModel)扩展BaseObservable,LiveData则仅使用监视数据的布局会发生变化.我理解的主要目标之一LiveData是以编程方式观察和更新UI,但对于简单的更新,Data Binding非常有用.
这个问题已经报道过(GitHub和Stack Overflow),并且首先说版本1.0会有它,现在据说这个功能正在开发中.
为了同时使用LiveData和Data Binding,我创建了一个非常简单的类实现,它扩展了BaseObservable:
import android.arch.lifecycle.LiveData
import android.arch.lifecycle.MutableLiveData
import android.databinding.BaseObservable
class ObservableMutableLiveData<T>() : BaseObservable() {
private var data: MutableLiveData<T> = MutableLiveData()
constructor(data: T) : this() {
this.data.value = data
}
public fun set(value: T) {
if (value != data.value) {
data.value = value …Run Code Online (Sandbox Code Playgroud) android kotlin android-databinding android-mvvm android-architecture-components
我正在尝试使用新的Android数据绑定库绑定自定义视图上的事件,但遇到了问题.
这是我的自定义视图的相关部分:
public class SuperCustomView extends FrameLayout {
private OnToggleListener mToggleListener;
public interface OnToggleListener {
void onToggle(boolean switchPosition);
}
public void setOnToggleListener(OnToggleListener listener) {
mToggleListener = listener;
}
.../...
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用此自定义视图并onToggle使用以下内容绑定事件:
<data>
<variable
name="controller"
type="com.xxx.BlopController"/>
</data>
<com.company.views.SuperCustomView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:onToggle="@{controller.toggleStrokeLimitation}"
app:custom_title="Blah"
app:custom_summary="Bloh"
app:custom_widget="toggle"/>
Run Code Online (Sandbox Code Playgroud)
toggleStrokeLimitation控制器上的方法在哪里:
public void toggleStrokeLimitation(boolean switchPosition) {
maxStrokeEnabled.set(switchPosition);
}
Run Code Online (Sandbox Code Playgroud)
编译时出现此错误:
> java.lang.RuntimeException: Found data binding errors.
****/ data binding error ****msg:Cannot find the setter for attribute 'app:onToggle' with parameter type java.lang.Object. file:/path/to/androidapp/app/src/main/res/layout/fragment_stroke.xml loc:36:35 - 36:67 …Run Code Online (Sandbox Code Playgroud) 当我尝试运行我的应用程序时出现以下错误:
Error:Execution failed for task ':app:compileDevelopmentDebugJavaWithJavac'.
> java.lang.RuntimeException: Found data binding errors.
****/ data binding error ****msg:Could not find accessor java.lang.String.giftRecipientName redacted.xml loc:182:63 - 182:93 ****\ data binding error ****
Run Code Online (Sandbox Code Playgroud)
我有一个Order对象,如下所示:
public class Order {
public Address address;
// unrelated fields and methods
}
Run Code Online (Sandbox Code Playgroud)
嵌套的Address对象如下所示:
public class Address {
public String addressLine1;
public String addressLine2;
public String giftRecipientName;
public Boolean isGift;
}
Run Code Online (Sandbox Code Playgroud)
在我的.xml中,我正在执行以下操作:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="order" type="example.redacted.models.Order"/>
</data>
// widgets and whatnot
<TextView
android:id="@+id/gift_recipientTV"
android:layout_column="1"
android:layout_weight="1"
android:layout_width="0dp"
android:textStyle="bold" …Run Code Online (Sandbox Code Playgroud) 我正在使用数据绑定来绑定我的Android应用程序中的布局.
我已经设置了我的布局(my_custom.xml)并生成了绑定类(MyCustomBinding),但Android Studio似乎没有立即找到Binding类的.inflate(...)方法,将其标记为错误(红色文字!).
代码似乎是正确的,因为它编译和构建很好的APK.
如何让Android Studio正确更新?
这是我的自定义查看代码:
public class MyCustomView extends FrameLayout {
public MyCustomView(Context context) {
this(context, null, 0);
}
public MyCustomView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyCustomView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
MyCustomBinding binding = MyCustomBinding.inflate(inflater, this, true);
binding.aButton.setText("Whatever");
}
}
Run Code Online (Sandbox Code Playgroud)
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android">
<data>
</data>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:id="@+id/a_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click me!"
android:padding="10dp"
android:background="#000"
android:textColor="#fff"
android:layout_gravity="center"
/> …Run Code Online (Sandbox Code Playgroud) 通过数据绑定,我们现在经常看到布局文件中的代码,如下所示:
<Variable name="displayIt" type="Boolean"/>
Run Code Online (Sandbox Code Playgroud)
然后:
android:visibility="@{displayIt ? View.VISIBLE : View.GONE}"
Run Code Online (Sandbox Code Playgroud)
(当然必须首先为View.VISIBLE和View.GONE导入android.view.View才有任何意义)
这使得控制视图更加容易.它还告诉我在XML Layout中允许使用条件语句,但看起来我的google-fu很弱,我试过并找不到这个语法.如果我想使用文字怎么办?就像是:
android:text="{@isValid ? "valid" : "invalid"}"
Run Code Online (Sandbox Code Playgroud)
(是的,我知道这是一种愚蠢的方式,我只是在谈论语法).或者资源ID怎么样?也许喜欢:
android:color="@{isValid ? R.color.green : R.color.red}"
Run Code Online (Sandbox Code Playgroud)
可以吗?什么是正确的语法?
我正在为我的Android项目使用Android Studio.当构建与奇怪的堆栈跟踪崩溃时,我遇到了一个问题,如下所示:
Error:Execution failed for task ':app:compileDevDebugJavaWithJavac'.
java.lang.RuntimeException: failure, see logs for details.
cannot generate view binders java.lang.NullPointerException
at android.databinding.tool.reflection.ModelMethod.isBoxingConversion(ModelMethod.java:155)
at android.databinding.tool.store.SetterStore.isBetterParameter(SetterStore.java:946)
at android.databinding.tool.store.SetterStore.getBestSetter(SetterStore.java:838)
Run Code Online (Sandbox Code Playgroud)
似乎数据绑定整体被破坏了.
我之前进行了重构,并在包之间移动了类.
java data-binding android nullpointerexception android-databinding
我在官方API文档中看到了DataBindingComponent.
https://developer.android.com/reference/android/databinding/DataBindingUtil.html
在编译期间生成此接口以包含所有使用的实例BindingAdapter的getter.当BindingAdapter是实例方法时,必须实例化实现该方法的类的实例.这个接口将使用getter为每个类生成,其名称为get*,其中*是声明BindingAdapter类/接口的简单类名.将通过向getter添加数字后缀来解析名称冲突.
也可以将此类的实例作为第一个参数传递给static或实例BindingAdapters.
如果使用Dagger 2,开发人员应扩展此接口并将扩展接口注释为Component.
但是,我在Web中找不到此类的任何示例用法.任何人都可以知道它是什么以及如何使用它.
我试着制作一些简单的代码并调试它以查看它是什么但它在变量上显示了null a变量.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding= DataBindingUtil.setContentView(this,R.layout.activity_main);
android.databinding.DataBindingComponent a = DataBindingUtil.getDefaultComponent();
setContentView(binding.getRoot());
}
Run Code Online (Sandbox Code Playgroud) 首先让我开始展示代码:
build.gradle(模块):
android {
compileSdkVersion 24
buildToolsVersion "24.0.2"
dataBinding {
enabled = true
}
defaultConfig {
applicationId "com.example.oryaa.basecalculator"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.google.android.gms:play-services-appindexing:8.1.0'
Run Code Online (Sandbox Code Playgroud)
activity_main.xml中:
<data>
<import type="android.view.View" />
<variable
name="baseCalcModel"
type="com.example.oryaa.basecalculator.BaseCalcModel">
</variable>
</data> <TextView
android:id="@+id/resultOutput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/resultTextView"
android:textColor="@color/DarkBlue"
android:text="@{baseCalcModel.calcResult}"
android:textSize="32dp" />
Run Code Online (Sandbox Code Playgroud)
MainActicity.java:
public class MainActivity extends AppCompatActivity {
EditText userInput = …Run Code Online (Sandbox Code Playgroud) android ×10
data-binding ×5
java ×2
android-architecture-components ×1
android-mvvm ×1
kotlin ×1
observable ×1
togglebutton ×1
xml ×1