2016-08-22 5 views
-3

Google의 Android DataBinding 라이브러리에 의존하는 사람들에게는 질문이지만 힌트는 아닙니다.Android 데이터 바인딩 일반화 문제

그래서 바인딩의 방법을 조정하고 view-models 부모에게 Activity 클래스로 유지함으로써 알리고 싶었습니다. 기본적으로 보이는 모양은 다음과 같습니다.

interface AbsViewModel extends BaseObservable { 
    final int NO_ID = -1; 
    int getVariableId(); 
    void start(); 
    void stop(); 
} 

class abstract AbsBindingActivity<VB extends ViewDataBinding> extends Activity { 
    private Map<Integer, AbsViewModel> mViewModels; 
    private VB mBinding; 

    public abstract getLayoutResource(); 

    protected void onCreate(Bundle savedInstanceState) { 
     mBinding = DataBindingUtil.setContentView(this, getLayoutResource()); 
    } 

    public VB getBinding() { 
     return mBinding; 
    } 

    public <VM extends AbsViewModel> VM registerViewModel(VM viewModel) { 
     int variableId = viewModel.getVariableId(); 
     if (variableId != AbsViewModel.NO_ID) { 
      mBinding.setVariable(variableId, viewModel); 
     } 
     mViewModels.put(variableId, viewModel); 
     return viewModel; 
    } 

    public <VM extends AbsViewModel> VM unregisterViewModel(int variableId) { 
     mBinding.setVariable(variableId, null); 
     return (VM) mViewModels.remove(variableId); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     start(); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     stop(); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     for (AbsViewModel viewModel : mViewModels.values()) { 
      viewModel.onSaveInstanceState(outState); 
     } 
    } 

    private void start() { 
     for (AbsViewModel viewModel : mViewModels.values()) { 
      viewModel.start(); 
     } 
    } 

    private void stop() { 
     for (AbsViewModel viewModel : mViewModels.values()) { 
      viewModel.stop(); 
     } 
    } 
} 

하지만 이상한 이유로 인해 BR과 DataBindings가 생성되지 않았습니다.

답변

0

실험적으로 나는 그것을위한 해결책을 발견했습니다. 이 방법이없는 어떤 신비한 이유로 (심지어 bodyless) 데이터 바인딩은 BR 클래스와 실제 바인딩을 생성하지 못합니다 :

public void setBinding(VB binding) { }

그래서, 나는이 문제에 직면 얼마나 많은 당신의 궁금을하고 당신이 한 경우 어떻게 그것을 해결하는 다른 방법이 있습니다.