【问题标题】:Databinding for inflated layouts in android does not refreshandroid中膨胀布局的数据绑定不会刷新
【发布时间】:2016-12-21 09:58:49
【问题描述】:

目前我正在为 android 开发一个应用程序并为我的 gui 使用数据绑定。

我的问题是我想显示的数据没有自动刷新。

我认为我的问题的根源是我将多个子视图膨胀到我的根视图中。我的视图层次结构如下所示:

  • layout_activity_main
    • fragment_layout_0(此处无数据绑定)
    • fragment_layout_1(用于显示特定设备详细信息的布局)
      • process_data_view
        • value_0_view
        • value_1_view
        • ...
      • interface_view
      • ...

我对 process_data_view 和 value_x_view 使用数据绑定,以便自动刷新视图。如果设备不包含过程数据,则 process_data_view 应该是不可见的。直到此时它工作正常,因为设备的数据绑定是在片段的 onCreateView 方法中设置的。

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup Bundle savedInstanceState) {
        binding = DataBindingUtil.inflate(inflater,R.layout.layout_details_new,container,false);
        return binding.getRoot();
    }

当没有流程数据时,视图是不可见的,当我在运行时收到流程数据时,视图会自动可见。

但现在我想为 value_x_view 膨胀另一个 xml 文件。我这样充气:

private void setValue(View view, int value){
            ValueViewBinding valueBinding = DataBindingUtil.inflate(getLayoutInflater(null), R.layout.value_view, (LinearLayout)view, false);
            valueBinding.setValue(value)
            View valueView = valueBinding.getRoot();
            ((LinearLayout) view).addView(valueView);
}

*参数“view”是父片段布局中的LinearLayout

当我运行应用程序时,我膨胀了大约 12 个 value_views 并且它们正确显示。唯一的问题是它们没有得到刷新。它们仅显示 value_view 膨胀时有效的值。

有没有办法让数据绑定工作。我错过了什么或我做错了什么?

【问题讨论】:

  • 不知道你的数据绑定,但尝试 getActivity().getLayoutInflater() 而不是 getLayoutInflater(null)
  • 我试过了,但现在我的 value_views 不再膨胀了
  • 抱歉,它们确实膨胀了。但值仍然没有刷新

标签: android data-binding android-databinding


【解决方案1】:

这段代码:

private void setValue(View view, int value){
    ValueViewBinding valueBinding = DataBindingUtil.inflate(getLayoutInflater(null), R.layout.value_view, (LinearLayout)view, false);
    valueBinding.setValue(value)
    View valueView = valueBinding.getRoot();
    ((LinearLayout) view).addView(valueView);
}

有点问题。通货膨胀和价值设定正在以相同的方法完成。这意味着如果你想调整值,你最终会膨胀并添加一个新的视图,我认为你不想这样做。

也许您更愿意在布局中使用 ViewStub。然后,当你想给它充气时,你只需将它设置为可见。然后变量赋值会毫不费力地保持最新。

<layout ...>
    <data><variable name="value" type="int"/></data>
    <LinearLayout ...>
        <!-- other layouts -->
        <ViewStub android:id="@+id/lateInflation" app:value="@{value}"/>
    </LinearLayout>
</layout>

您拥有的另一个选项是向绑定添加一个侦听器,并且每当值更改时,您自己更新膨胀的布局。那是更多的工作:

private void setValue(View view, int value){
    final ValueViewBinding valueBinding = DataBindingUtil.inflate(getLayoutInflater(null), R.layout.value_view, (LinearLayout)view, false);
    valueBinding.setValue(value)
    View valueView = valueBinding.getRoot();
    ((LinearLayout) view).addView(valueView);
    // I don't know what your containing
    final LayoutDetailsNewBinding binding = DataBindingUtil.findBinding(view);
    binding.addOnPropertyChangedCallback(new OnPropertyChangedCallback() {
        @Override
        public void onPropertyChanged(Observable sender, int propertyId) {
            // assume the variable name in LayoutDetailsNewBinding is 'value'
            if (propertyId == BR.value) {
                valueBinding.setValue(binding.getValue());
            }
        }
    }
}

【讨论】:

  • 嗨,乔治,感谢您的回答!我膨胀布局并设置绑定值的部分是故意的,因为我只想设置一次并让数据绑定更新我的 gui。我认为这就是数据绑定的用途。如果我错了,请纠正我。我试图实现绑定监听器。当我调试应用程序时,我注意到 onPropertyChanged() 方法永远不会被调用。也许我对 notifyPropertyChange‌​d() 调用有疑问。我会调查一下。
  • 我发现了我的问题。在运行时,我销毁了对绑定到布局的对象的引用。现在我只需注意以适当的方式刷新我的数据对象并且它可以工作。另一种方法是重新绑定我刷新的对象,在这种情况下,我必须注意不要再次膨胀布局(正如乔治所说)
猜你喜欢
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
相关资源
最近更新 更多