在新场景中有第一个场景中没有的按钮。
当我更改到新场景时,数据绑定(bind)不起作用 - 我无法将 onClick 从新按钮委托(delegate)给 ViewModel。
我目前的逻辑是:
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
TestViewModel testViewModel = new TestViewModel();
ViewDataBinding binding = DataBindingUtil.inflate(inflater, R.layout.test_fragment, container, false);
binding.setVariable(BR.vm, viewModel);
binding.executePendingBindings();
return mainView.getRoot();
}
public void changeToSceneB() {
ViewGroup sceneRoot = (ViewGroup) getView().findViewById(R.id.scene_root);
Scene loadedScene = Scene.getSceneForLayout(sceneRoot, R.layout.test_scene_b, getContext());
Transition transition = TransitionInflater.from(context).inflateTransition(R.transition.test_transition);
TransitionManager.go(loadedScene, transition);
}
}
这是 test_fragment XML 的一部分:
<FrameLayout
android:id="@+id/scene_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/appBar"
android:layout_gravity="center_horizontal"
android:layout_marginLeft="@dimen/activity_margin"
android:layout_marginRight="@dimen/activity_margin"
android:layout_marginTop="70dp">
<include
layout="@layout/test_scene_a"
binding:vm="@{vm}"/>
</FrameLayout>
这就是 test_scene_b 的样子(代码已更改,我留下了最有趣的部分):
<?xml version="1.0" encoding="utf-8"?>
<data>
<variable
name="vm"
type="com.test.test.TestViewModel"/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="@dimen/dialog_margin"
android:gravity="bottom"
android:orientation="vertical">
<Button
style="@style/RoundedButtonGrey"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dialog_margin"
android:onClick="@{() -> vm.testFirst()}"
android:text="Test 1"/>
<Button
style="@style/RoundedButtonRed"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/activity_margin"
android:onClick="@{() -> vm.testSecond()}"
android:text="Test 2"/>
</LinearLayout>
你能告诉我为什么数据绑定(bind)不起作用吗?
最佳答案
原因是:当你为第二个场景设置xml时,你没有为这个场景提供绑定(bind)变量,所以当它进入时它不包含你的 View 模型。
解决方法是:
- 膨胀 TestSceneBBinding
- 在此绑定(bind)中设置 View 模型
- 使用Scene(viewGroup1, viewGroup2)构造器创建Scene
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
TestViewModel testViewModel = new TestViewModel();
ViewDataBinding binding = DataBindingUtil.inflate(inflater, R.layout.test_fragment, container, false);
binding.setVariable(BR.vm, viewModel);
binding.executePendingBindings();
return mainView.getRoot();
}
public void changeToSceneB() {
ViewGroup sceneRoot = (ViewGroup) getView().findViewById(R.id.scene_root);
TestSceneBBinding testSceneBBinding = TestSceneBBinding.inflate(layoutInflater, this.root_group, false)
newScreenBinding.vm = viewModel
Scene loadedScene = Scene(sceneRoot, testSceneBBinding.rootGroup);
Transition transition = TransitionInflater.from(context).inflateTransition(R.transition.test_transition);
TransitionManager.go(loadedScene, transition);
}
希望对你有帮助:)
关于Android数据绑定(bind)和场景转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46600555/