如何将Android按钮的启用属性绑定到ViewModel

时间:2013-10-01 18:49:03

标签: java android button binding viewmodel

我对Android开发有些新意,现在正在维护一个使用“android-binding”框架来利用MVVM模式的项目。

我想在用户按下后禁用Android按钮,以防止双击。我更喜欢通过以某种方式将按钮的“enabled”属性绑定到ViewModel来实现这一点。我猜我需要对某些属性使用“绑定:启用”但我不确定代码应该是什么样子。

我的Button的xml如下所示:

<Button 
android:drawableTop="@drawable/sync_action"
android:layout_height="wrap_content" 
android:textColor="@color/title_text"
android:id="@+id/syncButton" 
style="@style/ActionButton" 
android:text="@string/syncSyncActionHeader"
binding:enabled="isSyncEnabled"
binding:onClick="beginSync"/>

我的ViewModel类看起来像......

public class SyncViewModel{

   public final Command beginSync   = new Command(){

        @Override
        public void Invoke(View arg0, Object... arg1) {

            //do Sync stuff
        }
    };

   //WHAT GOES HERE?  Want to bind button's enabled property to a boolean.  
}

请让我知道该代码中“什么在这里”的内容。

1 个答案:

答案 0 :(得分:1)

防止双击UI按钮的解决方案不是禁用UI按钮。解决方案是让按钮使用AsyncTask来执行它的职责,并在允许它再次执行之前检查该AsyncTask的状态。

SyncScreen.xml

<Button 
android:id="@+id/syncButton" 
style="@style/ActionButton" 
android:text="@string/syncText"
binding:onClick="beginSync"/>

SyncViewModel.java

public class SyncViewModel
{

...

public final Command beginSync = new Command(){

    private SyncAsyncTask task;

    @Override
    public void Invoke(View arg0, Object... arg1) {

        if( task == null || task.getStatus() == Status.FINISHED )
        {
            task = new CustomAsyncTask(customParams);
            task.execute();
        }

    }
};

public class CustomAsyncTask extends AsyncTask<Void, Void, String>{
    ....
    //Irrelevant implementation details
    ....
}