我正在开发一种监视器,它应该根据我从机器收到的内容更新大量的图像视图(假的LED)并让用户知道当前的机器状态。 有没有办法在变量上设置一个值侦听器,当值更改时我可以更新我的UI来触发方法?
答案 0 :(得分:0)
感谢大家的帮助和意见;
我发现数据绑定在我的情况下是最好的选择,所以经过几次尝试我已经能够构建一个示例项目,其中我有一个处理器,每1秒增量整数值乘以1。 之后我检查该值是配对还是绝望,我设置了一个真或假的假。
我设置了一个布局文件,其中有2个文本视图和一个切换按钮。第一个文本视图文本绑定到一个带有我名字的简单字符串,第二个绑定到每秒递增的整数(一个计时器),并将切换按钮绑定到布尔值。
以下是代码:
<强> MainActivity 强>
public class MainActivity extends AppCompatActivity {
ActivityMainBinding binding;
android.os.Handler Handler;
User user;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
user = new User("Lorenzo", "Gangemi", 0);
binding.setUser(user);
useHandler();
}
public void useHandler() {
if (Handler != null) {
Handler.postDelayed(RunableHandler, 1000);
Handler.removeCallbacks(RunableHandler);
}
try {
Handler = new Handler();
} catch (Exception e) {
Handler = new Handler(Looper.getMainLooper());
}
Handler.postDelayed(RunableHandler, 1000);
}
private Runnable RunableHandler = new Runnable() {
@Override
public void run() {
user.increment_i();
binding.setUser(user);
useHandler();
}
};
}
用户强>
public class User {
private final String firstName;
private final String lastName;
private boolean pari;
private int i;
public User(String firstName, String lastName, int i) {
this.firstName = firstName;
this.lastName = lastName;
this.i = i;
setPari(checkPari());
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public int getI() {
return i;
}
public void increment_i()
{
i++;
setPari(checkPari());
}
public boolean checkPari()
{
return i%2==0;
}
public boolean isPari() {
return pari;
}
public void setPari(boolean pari) {
this.pari = pari;
}
}
<强> activity_main.xml中强>
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="mdptech.databinding.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{Integer.toString(user.i)}" />
<ToggleButton
android:text="ToggleButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/toggleButton"
android:drawableBottom="@drawable/toggle"
android:background="@android:color/transparent"
android:textOff="OFF"
android:textOn="ON"
android:checked="@{user.pari ? true : false}"/>
</LinearLayout>
</layout>
一切正常。
从代码中可以看出,在处理程序Runnable中我调用了增加计时器的方法,但是我也必须调用binding.setUser(user);
来更新布局。
有没有办法让这个更新自动发生,而不是因为我称之为方法?
这不是一个大问题,因为我可以创建一个单独的处理程序,每隔100毫秒(例如)和可运行的调用binding.setUser(user);
循环,但它会加速我的工作。
谢谢。