2016-06-22 14 views
3

In offiziellen Android-Dokumente - gibt es einige Anleitungen, wie Databinding in Fragmenten und Aktivitäten zu verwenden. Allerdings habe ich ziemlich komplexe Picker mit vielen Einstellungen. Etwas wie:android Datenbindung in benutzerdefinierten Steuerelementen

class ComplexCustomPicker extends RelativeLayout{ 
    PickerViewModel model; 
} 

Also meine Frage ist, welche Methode des Pickers I außer Kraft setzen müssen in der Lage verwenden Bindung im Inneren zu sein und nicht seting/Prüfung einzelner Werte wie Textfeld, etc?

Und zweite Frage - wie könnte ich ViewModel zu meinem Picker in XML-Datei übergeben, brauche ich einige benutzerdefinierte Attribute dafür?

Antwort

2

Ich denke, die Verwendung von Custom Setter wird Ihr Problem lösen. Check this section in Richtlinien für Entwickler.

Ich kann Ihnen ein kurzes Beispiel dafür geben. Angenommen, der Name Ihrer Ansicht ist CustomView und Ihr Viewmodel ist ViewModel, dann in jeder Klasse, erstellen Sie eine Methode wie folgt:

@BindingAdapter({"bind:viewmodel"}) 
public static void bindCustomView(CustomView view, ViewModel model) { 
    // Do whatever you want with your view and your model 
} 

Und in Ihrem Layout, wie folgt vorgehen:

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/tools"> 

    <data> 

     <variable 
      name="viewModel" 
      type="com.pkgname.ViewModel"/> 
    </data> 

    // Your layout 

    <com.pkgname.CustomView 
    // Other attributes 
    app:viewmodel="@{viewModel}" 
    /> 

</layout> 

Und von Ihrem Activity Gebrauch dies das Ansichtsmodell setzen:

MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity); 
ViewModel viewModel = new ViewModel(); 
binding.setViewModel(viewModel); 

Oder Sie können aus Ihrer benutzerdefinierten Ansicht direkt aufblasen:

LayoutViewCustomBinding binding = DataBindingUtil.inflate(LayoutInflater.from(getContext()), R.layout.layout_view_custom, this, true); 
ViewModel viewModel = new ViewModel(); 
binding.setViewModel(viewModel); 
+4

Gute Antwort! Wenn Sie eine Setter-Methode für Ihren 'ComplexCustomPicker' haben, die' PickerViewModel' verwendet, brauchen Sie auch nicht das 'BindingAdaper'. Android Data Binding versucht automatisch, etwas mit dem Namen setXxx zu finden, wobei Xxx das Attribut ist. Wenn 'ComplexCustomPicker' also eine Methode' void setViewModel (PickerViewModel) 'hat, können Sie wie oben das Attribut' app: viewModel = "@ {viewModel}" 'verwenden. Diese Technik bedeutet, dass Sie Ihre Ansicht an Ihre Modelltypen binden, aber das kann in Ihrer App in Ordnung sein. –

Verwandte Themen