2017-01-13 2 views
1

Я разрабатываю своего рода монитор, который должен обновлять множество изображений (поддельные светодиоды) на основе того, что я получаю с компьютера, и дать пользователю знать текущее состояние машины. Есть ли способ установить в переменной прослушиватель значений, который запускает метод при изменении значения, в котором я могу обновить свой интерфейс?Android-прослушиватель с переменным значением

+0

лучше написать свой образец кода, который вы сделали для этого, и сообщить нам, где вы столкнулись с проблемой. –

+1

одним из вариантов является привязка данных –

+1

что-то вроде [http://stackoverflow.com/questions/14457711/android-listening-for-variable-changes](http://stackoverflow.com/questions/14457711/android-listening-for -переменные-изменения)? –

ответ

0

Спасибо всем за помощь и комментарии;

я узнаю Data Binding был лучшим вариантом в моем случае, так что после нескольких попыток я был в состоянии построить пример проект, где у меня есть обработчик, который каждые 1ски приращение целочисленного значения по 1. После этого я проверяю, является ли значение парой или dispair, и я установил boolen true или false.

Я установил файл макета, в котором у меня есть 2 текстовых вида и кнопка переключения. Первый текст текстового вида привязан к простой строке с моим именем, второй привязан к целому числу, которое увеличивается каждый раз (таймер), а кнопка Toggle привязывается к логическому.

Вот код:

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 мс (например) и в его runnable call binding.setUser(user);, но это ускорит мою работу. Спасибо.

+0

Возможно, я говорю о двухстороннем привязке данных, не зная –

Смежные вопросы