因为它支持
android中的数据绑定菜单?
我写了这段代码,但错误:“错误:(16,26)没有指定资源类型(在’visible’处,值为’@ {item.visible}’).”
我写了这段代码,但错误:“错误:(16,26)没有指定资源类型(在’visible’处,值为’@ {item.visible}’).”
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <data> <variable name="item" type="ru.dixy.ubiworkerchecklistsmobile.Models.Fact"/> <import type="android.view.View"/> </data> <item android:id="@+id/compliteitem" android:title="mybutton" android:icon="@drawable/complite" android:visible="@{item.visible}" app:showAsAction="ifRoom" /> </menu>
解决方法
“目前,数据绑定仅适用于布局资源,而不适用于菜单资源”
但是,可以使用Observable.OnPropertyChangedCallback实现该行为.首先,您需要定义OnPropertyChangedCallback:
private final Observable.OnPropertyChangedCallback propertyChangedCallback = new Observable.OnPropertyChangedCallback() { @Override public void onPropertyChanged(Observable observable,int i) { getActivity().invalidateOptionsMenu(); } };
假设您的片段中有Fact模型的绑定:
<variable name="item" type="ru.dixy.ubiworkerchecklistsmobile.Models.Fact"/>
现在,您需要注册propertyChangedCallback并在完成后取消注册:
@Override public void onStart() { super.onStart(); binding.getItem().addOnPropertyChangedCallback(propertyChangedCallback); } @Override public void onStop() { super.onStop(); binding.getItem().removeOnPropertyChangedCallback(propertyChangedCallback); }
现在我们已经准备好根据Fact模型更新您的视图状态:
@Override public void onCreateOptionsMenu(Menu menu,MenuInflater inflater) { super.onCreateOptionsMenu(menu,inflater); inflater.inflate(R.menu.menu_fact,menu); } @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); menu.findItem(R.id.compliteitem).setVisible(binding.getItem().isVisible()); }