Create two-way binding with Android Data Binding

前端 未结 6 1335
情深已故
情深已故 2020-12-08 06:33

I have implemented the new Android data-binding, and after implementing realised that it does not support two-way binding. I have tried to solve this manually but I am strug

6条回答
  •  孤城傲影
    2020-12-08 07:05

    POJO:

    public class User {
        public final ObservableField firstName =
                new ObservableField<>();
        public final ObservableField lastName =
                new ObservableField<>();
    
        public User(String firstName, String lastName) {
            this.firstName.set(firstName);
            this.lastName.set(lastName);
    
        }
    
    
        public TextWatcherAdapter firstNameWatcher = new TextWatcherAdapter(firstName);
        public TextWatcherAdapter lastNameWatcher = new TextWatcherAdapter(lastName);
    
    }
    

    Layout:

     
            
    
            
            
    

    Watcher:

    public class TextWatcherAdapter implements TextWatcher {
    
        public final ObservableField value =
                new ObservableField<>();
        private final ObservableField field;
    
        private boolean isInEditMode = false;
    
        public TextWatcherAdapter(ObservableField f) {
            this.field = f;
    
            field.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback(){
                @Override
                public void onPropertyChanged(Observable sender, int propertyId) {
                    if (isInEditMode){
                        return;
                    }
                    value.set(field.get());
                }
            });
        }
    
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            //
        }
    
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            //
        }
    
        @Override public void afterTextChanged(Editable s) {
            if (!Objects.equals(field.get(), s.toString())) {
                isInEditMode = true;
                field.set(s.toString());
                isInEditMode = false;
            }
        }
    
    }
    

提交回复
热议问题