J'ai du mal à obtenir des fonctionnalités pour travailler avec les filateurs Android lorsqu'ils sont configurés avec la liaison de données bidirectionnelle. Je voudrais définir la valeur initiale du spinner via la liaison de données bidirectionnelle sur android:selectedItemPosition
. Les entrées spinner sont initialisées par ViewModel et sont remplies correctement, par conséquent la liaison de données semble fonctionner correctement.Sélection du paramètre Spinner Android avec une liaison bidirectionnelle
Le problème est lié à la liaison bidirectionnelle de selectedItemPosition
. La variable est initialisée à 5 par ViewModel mais l'élément sélectionné du spinner reste à 0 (le premier élément). Lors du débogage, il apparaît que la valeur de ObservableInt est initialement 5 (comme définie) mais est réinitialisée à zéro pendant la deuxième phase de executeBindings.
Toute aide serait appréciée.
test_spinner_activity.xml
<layout xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable name="viewModel"
type="com.aapp.viewmodel.TestSpinnerViewModel"/>
</data>
<LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.AppCompatSpinner
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="@+id/sTimeHourSpinner"
android:selectedItemPosition="@={viewModel.startHourIdx}"
android:entries="@{viewModel.startTimeHourSelections}"/>
</LinearLayout>
</layout>
TestSpinnerViewModel.java
public class TestSpinnerViewModel {
public final ObservableArrayList<String> startTimeHourSelections = new ObservableArrayList<>();
public final ObservableInt startHourIdx = new ObservableInt();
public TestSpinnerViewModel(Context context) {
this.mContext = context;
for (int i=0; i < 24; i++) {
int hour = i;
startTimeHourSelections.add(df.format(hour));
}
startHourIdx.set(5);
}
}
TestSpinnerActivity.java
public class TestSpinnerActivity extends AppCompatActivity {
private TestSpinnerActivityBinding binding;
private TestSpinnerViewModel mTestSpinnerViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.bind(findViewById(R.id.test_spinner));
mTestSpinnerViewModel = new TestSpinnerViewModel(this);
binding.setViewModel(mTestSpinnerViewModel);
}
Je Android Studio 2.2.2 et Databinding est activé.
Juste un heads-up, ce n'est pas databinding dans les deux sens, mais juste _databinding_. Dans les deux sens implique de changer l'objet change l'interface utilisateur. – Chisko
Salut @chisko, je suis confus par ton commentaire. En utilisant la dernière version d'Android Studio et les bibliothèques de liaison, vous déclarez simplement une variable dans la mise en page en utilisant "@ = {variable}" comme je l'ai fait avec 'android: selectedItemPosition =" @ = {viewModel.startHourIdx} "' génère le code de la plaque de la chaudière pour le faire 2 voies. –
Non. Docs Android sont un peu déroutant et trompeur à ce sujet. Ce que vous décrivez ci-dessus est une liaison à sens unique, dans laquelle les modifications de l'interface utilisateur sont automatiquement répercutées sur le modèle. – Chisko