标签: android-databinding

数据绑定 - Lambda 表达式必须首先解析为其设置器才能获取类型

我从数据绑定开始,但是一旦创建函数,我就无法运行该项目onClick,这是我的layout

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
        <variable
            name="userViewModel"
            type="com.myproject.example.UserViewModel" />
    </data>
    ....
    <Button
                android:id="@+id/btnSave"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@={userViewModel.saveOrUpdateButton}"
                android:onClick="@={() -> userViewModel.saveOrUpdate()}"
                 />

Run Code Online (Sandbox Code Playgroud)

仅当我运行它时才出现的问题./gradlew :app:kaptDebugKotlin --stacktrace指向 onClick() 方法

还有这个

引起原因:org.gradle.workers.internal.DefaultWorkerExecutor$WorkExecutionException:执行 org.jetbrains.kotlin.gradle.internal.KaptExecution 时发生故障

导致:org.jetbrains.kotlin.kapt3.base.util.KaptBaseError:注释处理时出现异常

我的build.gradle包含:

应用插件:'kotlin-kapt'

数据绑定 { 启用 = true }

以及依赖项:

dependencies {
    def lifecycle_version = "2.2.0"
    def room_version = "2.2.3"
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.core:core-ktx:1.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'

    // ViewModel
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
    // LiveData
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
    // Annotation …
Run Code Online (Sandbox Code Playgroud)

android mvvm kotlin android-databinding

2
推荐指数
1
解决办法
1245
查看次数

资源包装密封类,数据绑定错误

我在使用数据包装时遇到了一个小问题Resource,我不知道如何在数据绑定中使用它。

密封等级

sealed class Resource<out T: Any> {
    data class Success<out T: Any>(val data: T): Resource<T>()
    data class Error(val exception: Throwable): Resource<Nothing>()
    object Loading: Resource<Nothing>()
}
Run Code Online (Sandbox Code Playgroud)

我有这个val product: LiveData<Resource<NetworkProductDetails>>

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="viewModel"
            type="my.package.ProductDetailsViewModel" />
    </data>

    <TextView
        android:id="@+id/product_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@{viewModel.product.productName}"
        android:textAppearance="?attr/textAppearanceBody1"
        android:gravity="center"/>

    ...
</layout>
Run Code Online (Sandbox Code Playgroud)

我遇到了一个问题,因为viewModel.product不是NetworkProductDetails但是Resource<NetworkProductDetails>,而且我的 XML/数据绑定不知道如何处理它。


我找到了一种工作方式,但我想知道是否有更优雅的方式。

第一个解决方案:

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="viewModel"
            type="my.package.ProductDetailsViewModel" />
        <variable
            name="product"
            type="my.package.NetworkProductDetails" />
    </data>

    <TextView
        android:id="@+id/product_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@{product.productName}"
        android:textAppearance="?attr/textAppearanceBody1"
        android:gravity="center"/>

    ... …
Run Code Online (Sandbox Code Playgroud)

android android-databinding sealed-class

2
推荐指数
1
解决办法
5319
查看次数

更改 LiveData 时 DataBinding 不更新值

我希望当我按下按钮并将其写入textview. 然而,下面的代码将增加的值显示为 Log 但在屏幕上, in 的值textview没有改变。我不确定出了什么问题。如果您知道,请告诉我。

片段.kt

class SettingFragment : Fragment(), View.OnClickListener {

    companion object {
        fun newInstance() = SettingFragment()
        private val TAG = "SettingFragment"
    }

    private lateinit var viewModel: SettingViewModel
    private lateinit var binding: FragmentSettingBinding

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = DataBindingUtil.inflate(inflater, R.layout.fragment_setting, container, false)
        return binding.root
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        viewModel = ViewModelProvider(this).get(SettingViewModel::class.java)
        binding.lifecycleOwner = this
        binding.button.setOnClickListener(this)
    }

    override fun onClick(v: View?) { …
Run Code Online (Sandbox Code Playgroud)

data-binding android kotlin android-databinding android-livedata

2
推荐指数
1
解决办法
731
查看次数

即使设置了lifecycleOwner,Android Fragment ViewModel数据绑定也不会更新UI

ViewModel我想在单击按钮时使用带有数据绑定的复选框来禁用复选框,但除非片段被销毁并重新创建,否则 UI 不会更新。

似乎有很多类似的问题,但最相似的问题似乎都可以通过设置来解决binding.lifecycleOwner,我已经完成了。

片段_复选框_数据绑定.xml:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".CheckboxDatabindingFragment">
    
    <data>
        <variable
            name="viewModel"
            type=".CheckboxDatabindingFragmentViewModel" />
    </data>

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

        <CheckBox
            android:id="@+id/my_checkbox"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:enabled="@{viewModel.checkboxEnabled}" />

        <Button
            android:id="@+id/my_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="@{() -> viewModel.startClicked()}" />
    
    </LinearLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)

CheckboxDatabindingFragment.kt:

class CheckboxDatabindingFragment() : Fragment() {
    private lateinit var viewModel: CheckboxDatabindingFragmentViewModel

    private var _binding: FragmentCheckboxDatabindingBinding? = null
    private val binding get() = _binding!!

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        viewModel = ViewModelProvider(this).get(CheckboxDatabindingFragmentViewModel::class.java )
        
        _binding …
Run Code Online (Sandbox Code Playgroud)

android android-fragments kotlin android-databinding android-viewmodel

2
推荐指数
1
解决办法
1132
查看次数

DataBindingComponents如何基于每个布局工作?

Android DataBinding库是我学习MVVM的迷人库。现在存在一个问题,即如何在基于布局的基础上将文本更新到UI之前播放动画。(不是BindingAdapter使用静态绑定适配器的全局布局的解决方案。)

从IO16视频中,我知道也许可以DataBindingComponentsetImageUrl示例一样使用它来实现这种效果,但是我找不到关于DataBindingComponents和BindingAdapter注释实例方法的工作方式的示例代码,有人可以提供有关此细节的信息吗?

== 更新2016-07-06 ==

我知道我可以使用带有自定义标签的静态绑定适配器,但这不是我想要的。

== 更新2017-08-04 ==我不知道为什么这个问题被标记为重复,如果您知道android数据绑定,则另一个问题完全不同。只是不知道如何删除重复标记,因此请在此处进行编辑。

data-binding android android-databinding

1
推荐指数
1
解决办法
714
查看次数

数据绑定BR未显示所有变量名称

我已经用MVVM模式实现了DataBinding,这是我的ViewModel课程。

public class MainViewModel extends BaseObservable {
    private String data, data1;

    @Bindable
    public String getData1() {
        return data1;
    }

    public void setData1(String data1) {
        this.data1 = data1;
    }

    @Bindable
    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
        notifyPropertyChanged(BR.data);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是,我可以看到BR.data有,但没能获得BR.data1,如何使用notifyPropertyChanged()data1变量。

我曾尝试清理该项目,也尝试过重建它,但并没有帮助我。

这是我的build.gradle档案

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    dataBinding {
        enabled = true
    }

    defaultConfig {
        ...
        ...
    }
    buildTypes …
Run Code Online (Sandbox Code Playgroud)

data-binding android android-databinding android-mvvm

1
推荐指数
1
解决办法
1240
查看次数

使用DataBinding在RecyclerView项目中绑定图像时出现闪烁图像

DataBinding在RecyclerView项目中使用绑定图像,如下面的代码,然后当我重新加载所有RecyclerView时使图像闪烁(通过notifyDataSetChange)
如果我不使用DataBinding并且只是正常设置图像,则图像不会闪烁我该怎么办?DataBinding?任何帮助或建议将不胜感激

我的RecyclerView适配器代码

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {
    private Context mContext;
    private List<String> list;
    public static class MyViewHolder extends RecyclerView.ViewHolder {
        ItemBinding mBinding;
        public MyViewHolder(ItemBinding mBinding) {
            super(mBinding.getRoot());
            this.mBinding = mBinding;
            mBinding.setViewHolder(this);
        }

        public int getSrc(){
            return R.drawable.ic_launcher;
        }
    }
    public RecyclerViewAdapter(Context context, List<String> moviesList) {
        this.mContext = context;
        this.list = moviesList;
    }
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        ItemBinding binding =
                DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.item,
                        parent, false);
        return new MyViewHolder(binding);
    }
    @Override …
Run Code Online (Sandbox Code Playgroud)

android android-recyclerview android-databinding

1
推荐指数
1
解决办法
1069
查看次数

数据绑定:不调用onClick方法

Android 4.3以上

我试图使用数据绑定。我从这里使用官方文档数据绑定

因此在app / build.gradle中

dataBinding {
        enabled = true
    }
Run Code Online (Sandbox Code Playgroud)

在我的xml布局文件中:

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

    <data>    
        <variable
            name="handler"
            type="com.myproject.SettingsFragment" />    
    </data>    
    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">    
        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"                >

            <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <android.support.constraint.ConstraintLayout
                    android:id="@+id/contentContainer"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">

                    <android.support.constraint.ConstraintLayout
                        android:id="@+id/contactUsContainer"
                        android:layout_width="match_parent"
                        android:onClick="@{handler::onClickContactUs}">    

                        <TextView
                            android:id="@+id/contactUsTextView"
                            android:layout_width="0dp"
                            android:layout_height="wrap_content"/>    

                    </android.support.constraint.ConstraintLayout>        
                </android.support.constraint.ConstraintLayout>
            </FrameLayout>
        </ScrollView>
    </android.support.constraint.ConstraintLayout>    
</layout>
Run Code Online (Sandbox Code Playgroud)

这是我的片段SettingsFragment.java

public class SettingsFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
         View rootView = inflater.inflate(R.layout.settings, container, …
Run Code Online (Sandbox Code Playgroud)

android-databinding

1
推荐指数
1
解决办法
1888
查看次数

使用三元运算符在Android MVVM数据绑定中可见

我在我的xml文件中遇到此代码的问题,错误:msg:标识符必须具有XML文件中的用户定义类型.视图缺少它.我想根据某些条件隐藏布局.

<include
            layout="@layout/test_ui"
            android:visibility="@{(viewModel.valueFormat==001) ? View.VISIBLE : View.GONE}"
            bind:viewModel="@{viewModel}" />
Run Code Online (Sandbox Code Playgroud)

android mvvm android-databinding

1
推荐指数
1
解决办法
1132
查看次数

从数据绑定Android调用Kotlin函数类型

我有一个BaseObservable用于数据绑定以显示网络状态的。在此类中,我传递了一个重试回调,该回调在每次单击按钮时都想运行:

class NetworkStateViewModel(val retryCallback: () -> Unit) : BaseObservable() {
    var networkState: NetworkState? = null
        set(value) {
            field = value

            notifyChange()
        }

    val isLoading: Boolean
        @Bindable get() = networkState is NetworkState.Loading

    val isShowingError: Boolean
        @Bindable get() = networkState is NetworkState.Error

    val errorText: String
        @Bindable get() = (networkState as? NetworkState.Error)?.error?.message.orEmpty()
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试retryCallback通过数据绑定进行引用时,它不能像它所说的那样进行编译cannot find method retryCallback() in class NetworkStateViewModel

<Button
    ...
    android:onClick="@{() -> viewModel.retryCallback()}"
    ... />
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经找到一种解决方法,我将其单独发布作为答案,但是我想知道是否可以直接调用此方法。

android kotlin android-databinding

1
推荐指数
1
解决办法
598
查看次数