2016-07-05 7 views
1

Android DataBinding Library ist eine charmante Bibliothek für mich MVVM zu lernen. Jetzt gibt es ein Problem, wie man eine Animation vor dem Aktualisieren des Textes auf der Benutzeroberfläche, pro Layout-Basis. (Keine Lösung für die globale Layout BindingAdapter, eine statische Bindung Adapter.)Wie funktioniert DataBindingComponents pro Layout-Basis?

Vom IO16 Video weiß ich, vielleicht kann ich DataBindingComponent nutze diesen Effekt zu erreichen, ebenso wie das setImageUrl Beispiel, aber ich kann jede Probe nicht gefunden Codes auf Wie genau DataBindingComponents und BindingAdapter annotierte Instanz Methoden arbeiten, kann jemand einige Details dazu bieten?

== Update 2016.07.06 ==

Ich weiß, ich kann einen statischen Bindung Adapter mit einem benutzerdefinierten Tags verwenden, aber das ist nicht das, was ich will.

== Update 2017.08.04 == Ich weiß nicht, warum diese Frage als Duplikat markiert ist, ist die andere Frage völlig anders, wenn Sie Android-Datenbindung kennen. Ich weiß nur nicht, wie ich die Duplizierungsmarke entfernen soll, also mache eine Bearbeitung hier.

Antwort

3

Nach dem IO16 Sitzung wieder beobachtete ich fand schließlich die Lösung:

Erstens eine Klasse mit einer beliebigen Methode als BindingAdapter kommentierten erstellen.

public class OptionBindingAdapter { 
    private boolean mOptionsShowing; 

    @BindingAdapter("android:text") 
    public void setOption(TextView button, String text) { 
     if (text == null) { 
      return; 
     } 

     if (button.getTranslationY() > 0) { 
      button.setText(text); 
      button.setVisibility(View.VISIBLE); 
      button.animate() 
        .translationY(0) 
        .start(); 
     } else { 
      button.animate() 
        .translationY(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200, button.getResources().getDisplayMetrics())) 
        .start(); 
     } 
    } 
} 

Dann erstellen Sie eine Klasse, die DataBindingComponent implementieren, da Sie erstellen Sie einfach eine Getter-Methode, die über eine Instanz der Klasse zurückgibt.

public class OptionBindingComponent implements DataBindingComponent { 
    private OptionBindingAdapter mOptionBindingAdapter = new OptionBindingAdapter(); 

    public OptionBindingAdapter getOptionBindingAdapter() { 
     return mOptionBindingAdapter; 
    } 
} 

Jetzt können Sie jede Instanz dieser Komponente erstellen und verwenden, wenn die Bindung, zum Beispiel in Aktivität # onCreate.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main, new OptionBindingComponent()); 
    mViewModel = new OptionsViewModel(new OptionsRepository(), this); 
    mBinding.setVariable(me.zhanghailin.androiddatabindingwithanimations.BR.options, mViewModel); 
} 

Fertig! das ist es, der Effekt ist, dass der Bindungsadapter für diese sehr bindende anstelle der Standardkomponente verwendet wird.

+0

Wie die neue OptionBindingComponent verwenden() von einem Fragment @Marvin –

+0

@ fɪəlɪs in Fragment # onCreate verwenden DataBindingUtil # setDefaultComponent –

+0

@ fɪəlɪs Die OptionBindingComponent geleitet werden soll, wenn das Layout aufgeblasen wird. Sie können es also als letzten Argument an 'DataBindingUtil.inflate (inflater, layoutId, parent, attachToParent, bindingComponent)' oder 'YourLayoutBinding.inflate (inflater, root, attachRoRoot, bindingComponent) 'übergeben – Marvin