关于变量值的Android Listener

时间:2017-01-13 11:30:43

标签: android user-interface

我正在开发一种监视器,它应该根据我从机器收到的内容更新大量的图像视图(假的LED)并让用户知道当前的机器状态。 有没有办法在变量上设置一个值侦听器,当值更改时我可以更新我的UI来触发方法?

1 个答案:

答案 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);循环,但它会加速我的工作。 谢谢。