2ウェイデータバインディングで設定した場合、Androidスピナーで機能するいくつかの機能を取得するのには苦労しています。私はandroid:selectedItemPosition
に2ウェイデータバインディングを介してスピナーの初期値を設定したいと思います。スピナーのエントリは、ViewModelによって初期化され、正しく挿入されるため、データバインディングは正しく動作しているように見えます。2ウェイバインディングによるAndroid Spinner設定の選択
問題は、双方向バインディングselectedItemPosition
にあります。変数はViewModelによって5に初期化されますが、スピナーの選択項目は0(最初の項目)のままです。デバッグすると、ObservableIntの値は最初は5に設定されているように見えますが、executeBindingsの2番目のフェーズでは0にリセットされます。
ご協力いただければ幸いです。
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);
}
私は、Android Studioの2.2.2を使用していますが、データバインディングが有効になっています。
ジャストヘッドアップ、これは、双方向のデータバインディングではなく、ただ_databinding_。双方向は、オブジェクトの変更UIを変更することを伴う。 – Chisko
こんにちは@chisko、私はあなたのコメントで混乱しています。 Android Studioとバインディングライブラリの最新バージョンを使用すると、 'android:selectedItemPosition =" @ = {viewModel.startHourIdx} "'でこれを実行したように、単に "@ = {variable}"を使用してレイアウト内の変数を宣言し、ボイラープレートコードを生成して2方向にします。 –
いいえ、Androidのドキュメントはこれについて少し混乱し、誤解を招くことがあります。上記で説明しているのは、UIへの変更が自動的にモデルに反映される一方向バインディングです。 – Chisko