我正在开发一种监视器,该监视器应根据我从机器接收到的内容更新许多图像视图(假LED),并让用户知道当前机器状态。有没有一种方法可以在变量上设置值侦听器,当值更改时可以触发方法来更新我的UI?
感谢大家的帮助和评论;
我发现数据绑定是我的最佳选择,因此,经过几次尝试,我已经能够构建一个示例项目,在该项目中,我有一个处理程序,该处理程序每1秒将一个整数值加1。在此之后,我检查如果值是成对或成对,并且我将布尔值设置为true或false。
我设置了一个布局文件,其中有2个文本视图和一个切换按钮。第一个文本视图文本绑定到一个具有我名字的简单字符串,第二个文本视图绑定到以每秒递增的整数(一个计时器),并且“切换按钮”绑定到布尔值。
这是代码:
主要活动
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);
,但这将大大加快我的工作。谢谢你。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句