我从数据绑定开始,但是一旦创建函数,我就无法运行该项目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) 我在使用数据包装时遇到了一个小问题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) 我希望当我按下按钮并将其写入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
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
Android DataBinding库是我学习MVVM的迷人库。现在存在一个问题,即如何在基于布局的基础上将文本更新到UI之前播放动画。(不是BindingAdapter使用静态绑定适配器的全局布局的解决方案。)
从IO16视频中,我知道也许可以DataBindingComponent像setImageUrl示例一样使用它来实现这种效果,但是我找不到关于DataBindingComponents和BindingAdapter注释实例方法的工作方式的示例代码,有人可以提供有关此细节的信息吗?
== 更新2016-07-06 ==
我知道我可以使用带有自定义标签的静态绑定适配器,但这不是我想要的。
== 更新2017-08-04 ==我不知道为什么这个问题被标记为重复,如果您知道android数据绑定,则另一个问题完全不同。只是不知道如何删除重复标记,因此请在此处进行编辑。
我已经用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) 我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 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) 我在我的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) 我有一个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)
到目前为止,我已经找到一种解决方法,我将其单独发布作为答案,但是我想知道是否可以直接调用此方法。