java—livedata对象在xml中是可观察的吗?

4urapxun  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(474)

当我绑定时 ObservableField<> 对象,通过 set() 立即反映在视图中。当我绑定时 LiveData<> 但是,初始值是呈现的,但通过 value= 对视图没有影响。它们被传递给Kotlin的观察员。
我以为 LiveData 会像这样工作 Observable* xml绑定中的类。不是这样吗?如果我需要在xml和kotlin中观察一个值,那么我真的需要创建两个观察值吗?

gkn4icbw

gkn4icbw1#

您可以使用数据绑定。https://developer.android.com/topic/libraries/data-binding/
使用数据绑定,当livedata发生更改时,您的xml将收到通知。您还可以将观察者附加到java代码中的相同实时数据。
希望这有帮助!

niwlg2el

niwlg2el2#

这对我来说是通过数据绑定来实现的,我假设您正在使用数据绑定。
你没有提供你的代码,所以我只能猜测也许你没有打电话 setLifecycleOwner() 在绑定对象上(例如。, ActivityMainBinding 对于一个 activity_main 布局资源)。否则,数据绑定将无法注册观察者。
此示例项目显示了使用 android:text="@{viewModel.sensorLiveData}"TextView . 在使用此布局的活动中,我使用 setLifecycleOwner() 教我如何装订 FragmentActivity :

/***
  Copyright (c) 2013-2017 CommonsWare, LLC
  Licensed under the Apache License, Version 2.0 (the "License"); you may not
  use this file except in compliance with the License. You may obtain a copy
  of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
  by applicable law or agreed to in writing, software distributed under the
  License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
  OF ANY KIND, either express or implied. See the License for the specific
  language governing permissions and limitations under the License.

  Covered in detail in the book _Android's Architecture Components_
    https://commonsware.com/AndroidArch
 */

package com.commonsware.android.livedata;

import android.arch.lifecycle.ViewModelProviders;
import android.databinding.BindingAdapter;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.widget.TextView;
import com.commonsware.android.livedata.databinding.MainBinding;

public class MainActivity extends FragmentActivity {
  @BindingAdapter("android:text")
  public static void setLightReading(TextView tv, SensorLiveData.Event event) {
    if (event==null) {
      tv.setText(null);
    }
    else {
      tv.setText(String.format("%f", event.values[0]));
    }
  }

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    MainBinding binding=MainBinding.inflate(getLayoutInflater());
    SensorViewModel vm=ViewModelProviders.of(this).get(SensorViewModel.class);

    binding.setViewModel(vm);
    binding.setLifecycleOwner(this);
    setContentView(binding.getRoot());
  }
}

如果你的设备有一个环境光传感器,它的工作原理就像一个champ。

相关问题