我有ViewModel:
class MyViewModel : ViewModel(){
private val _user = MutableLiveData("")
val user: LiveData<String> = _user
fun onBtnClick(){
Log.i("MyViewModel", "user: ${_user.value}")
}
}
我使用以下片段布局将其连接:
<data>
<variable
name="viewmodel"
type="com.pkg.pkg.pkg.fragments.concretePkg.MyViewModel" />
</data>
<EditText
...
android:text="@={viewmodel.user}"
android:hint="User" />
在onCreateView方法的片段类中:
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_my_fragment, container, false)
binding.lifecycleOwner = this
// bind viewModel
viewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
binding.viewmodel = viewModel
// Inflate the layout for this fragment
return binding.root
我可以从片段或ViewModel类中更改EditText
的值,但是当我试图在Logcat的ViewModel的onBtnClick
方法中获取该值时,我得到的消息是:{{ 1}}
我在这里缺少什么,以便双向数据绑定也可以从另一个方向进行?
简而言之,数据从ViewModel / Fragment到接口上的EditText,但不会从接口上的EditText到ViewModel字段/方法。
预先感谢。
-------编辑----- 我设法填充了所有内容,但知道我收到此错误:
I/MyViewModel: user:
我想那是因为viewmodel.user是LiveData类型而不是String。我已经编写了绑定适配器:
Details: There is no inverse for method getValue, you must add an @InverseMethod annotation to the method to indicate which method should be used when using it in two-way binding expressions
但是我仍然收到上述消息。
答案 0 :(得分:0)
首先,您需要公开_user
。然后,您需要使用"@={viewmodel._user}"
,以便获得_user
的值。如果您不公开数据绑定变量,则数据绑定API无法确定并生成代码。对于诸如String之类的简单字段,此方法就足够了,但是对于更复杂的情况,您可能必须实现BindingAdapters
。有关示例,请参见this文章。
答案 1 :(得分:0)
要解决此问题,您应该将其添加到build.gradle中。
"%WIX%bin\candle.exe" product.wxs -ext WixUIExtension >> Build.log
"%WIX%bin\light.exe" -out Test.msi product.wixobj -ext WixUIExtension >> Build.log
kotlin版本应降级:
implementation "android.arch.lifecycle:extensions:1.1.1"
干杯!