используя живые данные и mvvm, чтобы назначить слушателя вашему представлению - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть следующий 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()
        }

как мне указать путь к моему методу в представлении, чтобы иметь возможность установить его текст

1 Ответ

0 голосов
/ 01 января 2019

Да, вы можете легко установить слушателя в метод, который вы установили в 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);
}

}

Надеюсь!этот код поможет вамУдачного кодирования ...

...