【问题标题】:using live data and mvvm to assign listener to your view使用实时数据和 mvvm 将侦听器分配给您的视图
【发布时间】:2018-12-31 17:15:23
【问题描述】:

我有以下 xml

<com.google.android.material.textfield.TextInputEditText
                    android:id="@+id/to_textedit"
                    android:onClick="@{() -> viewModel.openTimePickerClicked()}"
                    android:layout_width="match_parent"
                    android:text="10:00 pm"
                    android:textSize="14sp"
                    android:layout_height="match_parent"/>

我正在使用视图模型来分配它是点击监听器,如下所示

    val openTimePickerClickEvent = LiveEvent<Unit>()
fun openTimePickerClicked() {
        openTimePickerClickEvent.call()
    }

在我的模型中,我将这个观察者绑定如下

private val openTimePickerClicked = Observer<Unit> {

            openTimePickerDialog () // here is the problem
        }

private fun openTimePickerDialog(textInputEditText : TextInputEditText) {

            val cal = Calendar.getInstance()

            val timeSetListener = TimePickerDialog.OnTimeSetListener { timePicker, hour, minute ->
                cal.set(Calendar.HOUR_OF_DAY, hour)
                cal.set(Calendar.MINUTE, minute)

                textInputEditText.setText(SimpleDateFormat("HH:mm").format(cal.time))
            }

            TimePickerDialog(
                binding.root.context,
                timeSetListener,
                cal.get(Calendar.HOUR_OF_DAY),
                cal.get(Calendar.MINUTE),
                false
            ).show()
        }

如何在视图中将视图路径到我的方法,以便能够设置它的文本

【问题讨论】:

    标签: android data-binding android-databinding


    【解决方案1】:

    是的,您可以轻松地在 XML 中设置的方法中设置侦听器。 请按照以下步骤操作:

    在 ViewModel 中定义回调/监听器,如下所示:

    public class MyViewModel extends ViewModel{
    private MyCustomCallback callback;
    ...
    public void doOnClick(MyCustomCallback mCallback){
        boolean isSuccessful = doMyAction.execute();
        if (isSuccessful){
            mCallback.actionIsSuccessful();
        } else {
            mCallback.actionFailed();
        }
    }
    ...
    public void setCallback(callback){
        this.callback = callback;   
    }
    public MyCustomCallback getCallback(){
        return this.callback;   
    }
    ...
    
    public interface MyCustomCallback{
        void actionIsSuccessful();
        void actionFailed();
    }}
    

    现在你已经在 XML 中设置了这个监听器/回调,如下所示:

    <com.google.android.material.textfield.TextInputEditText
                    android:id="@+id/to_textedit"
                    android:onClick="@{() -> ViewModel.doOnClick(ViewModel.callback)}"
                    android:layout_width="match_parent"
                    android:text="10:00 pm"
                    android:textSize="14sp"
                    android:layout_height="match_parent"/>
    

    现在您必须在主要活动中设置监听器。如下:

    public class MainActivity extends AppCompatActivity{
    ...
    private MyCustomCallback callback;
    @Override
    protected void onCreate(Bundle savedInstanceState){
        ...
        callback = new MyViewModel.MyCustomCallback{
            @Override
            public void actionIsSuccessful(){
                //do something when action is successful
            }
            @Override
            public void actionFailed(){
                //do something when action fails
            }
        }
        viewModel.setCallback(callback);
    }
    

    }

    希望!此代码将为您提供帮助。 快乐编码...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      相关资源
      最近更新 更多