Android数据绑定(bind)和场景转换

标签 android data-binding android-transitions

在新场景中有第一个场景中没有的按钮。

当我更改到新场景时,数据绑定(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 模型。

解决方法是:

  1. 膨胀 TestSceneBBinding
  2. 在此绑定(bind)中设置 View 模型
  3. 使用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/

相关文章:

android - 强制外部站点上的链接在 iOS 或 Android 应用程序上的 UIWebView 之外打开

android - SVN android studio "Import into version control"=> "Import into subversion"选项未显示

java - 动画启动屏幕后未显示主要 Activity

wpf - 如何在数据模板中实例化 ViewModel

android - 具有嵌套共享元素的场景转换

android - 如果方向改变, Activity 在 onActivityReenter 之后销毁

Android:如何计算dp?

.net - 为什么我的 TextBox 数据绑定(bind)不起作用?

c# - 当集合为空时,UWP XAML 抛出未处理的异常

android - 如何在 Activity 转换中包含一个独立的 View ?