2

부모 클래스가 있는데, BaseViewModel으로 호출 할 수 있습니다.이 클래스는 입력 할 수 있으며 ObservableField 같은 유형입니다. 이와 같이 :ObservableField <>를 사용한 양방향 데이터 바인딩, set()이 작동하지 않습니다?

public class BaseViewModel<T> extends BaseObservable { 

    ObservableField<T> value = new ObservableField<>(); 

    public T getValue() { 
     return value.get(); 
    } 

    public void setValue(T value) { 
     this.value.set(value); 
     setHasChanges(value != originalValue); 
    } 

} 

나는이 클래스에 대해 많은 자녀를 갖고있다. 그 중 하나는 입니다. StringViewModel은 이름에서와 같이 String 값을 제공합니다. 이 아이 클래스는 의 setValue() 방법 오버라이드 (override) :

public class StringViewModel extends BaseViewModel<String> { 

    @Override 
    public void setValue(String value) { 
     this.value.set(value); 
     if(value != null && !value.isEmpty()){ 
      setHasChanges(!value.equals(originalValue)); 
     } 
     else if(originalValue == null) 
      setHasChanges(false); 
     else 
      setHasChanges(!originalValue.isEmpty()); 
    } 

    //Other methods ... 

} 

을 그리고 나는 StringViewModel 사용 레이아웃을 가지고 :

<layout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools"> 

    <data> 

     <variable 
      name="viewModel" 
      type="com.myproject.viewmodels.StringViewModel" /> 

    </data> 

    <EditText 
     android:id="@+id/value" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 

     android:clickable="@{viewModel.editable}" 
     android:cursorVisible="@{viewModel.editable}" 

     android:ellipsize="end" 
     android:focusable="@{viewModel.editable}" 
     android:focusableInTouchMode="@{viewModel.editable}" 
     android:inputType="textMultiLine|textNoSuggestions" 

     android:text="@={viewModel.value}" 
     app:setError="@{viewModel.error}" 

     tools:text="Dupont" /> 

    <!-- Other layouts ... --> 

을하지만 난 의 setValue를 호출 할 때()방법 StringViewModel이면 값은 ViewModel로 설정되지만 EditText에는 설정되지 않습니다.

편집 : 나는 또한 내가 (내 데이터 바인딩을 팽창 DataBindingUtil를 사용하여) 올바르게 내 데이터 바인딩StringViewModel를 추가했습니다 있다고한다.

myDataBinding.setViewModel(new StringViewModel());

누군가가이 동작에 대한 설명을 가지고 있습니까? @iMDroid 말했듯이


편집

, 내 방법 setValue()에 전화 notifyChange()이 있어야합니다. 나는 힘들어 ObservableFields 나를 위해 그것을하고 있었다, 나쁘다.

답변

2

저는 양방향 데이터 바인딩 전문가는 아니지만 기사에 대한 기사를 읽었습니다. 여기에 도움이 될만한 해결책이 하나 있습니다.

public class Echo { 
    public String text; 
} 

그리고 당신의 레이아웃 파일은 다음 R.layout.echo

그들은 당신이 DataBindingUtil 클래스를 사용하여 레이아웃을 설정하기로되어 있다고 말한다

와 객체입니다

는 모델 클래스는이 가정하자 바인딩에 EchoBinding (자동으로 생성 된 )을 다음과 같이 만듭니다.

EchoBinding binding = DataBindingUtil.setContentView(
     this, R.layout.echo); 
    binding.setEcho(new Echo()); 

또한 app:binding="@{echo.text}" 속성을 사용하여 EditText에 값을 바인딩 할 수 있습니다.

<EditText 
    android:layout_width=”match_parent” 
    android:layout_height=”wrap_content” 
    android:hint="Text 1" 
    app:binding="@{echo.text}"/> 

그리고 마지막으로는 setValue() 방법에 notifyChange()를 추가합니다.

자세한 내용은 link을 참조하십시오.

시도해 볼 수 있습니다. 도움이 되었기를 바랍니다.

+0

도움을 주셔서 감사합니다. 그러나 제 질문을 편집하면서이 점을 언급하는 것을 잊었습니다. 실제로 DataBindingUtil을 사용하여 DataBinding에 내 변수를 올바르게 추가했습니다. – MHogge

+0

조차도 내 대답을 편집했습니다. notifyChange()를 추가하려고 했습니까? – iMDroid

+1

니스 작동 중! 나는 그것이 ObservableField 였기 때문에 나는 아무것도 알릴 필요가 없다고 생각했다. 도와 주셔서 감사합니다. 답변으로 받아 들일 것입니다. – MHogge

0

레이아웃에 StringViewModel을 추가하는 것만으로는 충분하지 않습니다. OnCreate() 또는 onCreateView() 중 어떤 것을 사용하는지 (Activity 또는 Fragment)에 따라 정의 된 StringViewModel 클래스를 사용하도록 dataBinding에 지시해야합니다.

, 당신이 그런 짓을 할에서 onCreate()에서

,

dataBinding.viewModel = 새로운 StringViewModel();

이제 데이터 바인딩은 사용자가 의미하는 바를 알고 있으며 이제 연결됩니다.

저는 데이터 바인딩을 설정했다고 생각합니다.

+0

예 StringViewModel을 DataBinding으로 설정했습니다. 죄송합니다. 질문을 업데이트하여이 정보를 추가하겠습니다. – MHogge