Я использую привязку данных + viewpager + фрагмент. Я установил два фрагмента. Оба фрагмента имеют одинаковый макет с разными именами. Проблема в том, что флажок во фрагменте 2 не может корректно обновляться, когда я установил ObservableBoolean, в то время как фрагмент 1 в порядке. Он не находится ни в проверенном, ни в непроверенном состоянии. Это в очень странном состоянии (см. Изображение ниже). Я думаю, это вызвано ViewPager. Но понятия не имею, как это исправить.
Изображение, показывающее неправильное состояние чекбокса Ниже приведен код. MainAcitivty. java
package com.jone.tablayouttest;
import android.arch.lifecycle.ViewModelProviders;
import android.databinding.BindingAdapter;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import com.jone.tablayouttest.databinding.ActivityMainBinding;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private ActivityMainBinding mBinding;
private ViewPager viewPager;
List<Fragment> mFragments = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
mBinding.setHandler(this);
mBinding.setManager(getSupportFragmentManager());
// mFragments.add(Fragment1.newInstance());
// mFragments.add(Fragment2.newInstance());
viewPager = mBinding.vpContent;
// viewPager.setAdapter(new FragmentStatePagerAdapter(getSupportFragmentManager()) {
// @Override
// public Fragment getItem(int position) {
// return mFragments.get(position);
// }
//
// @Override
// public int getCount() {
// return mFragments.size();
// }
//
// @Override
// public int getItemPosition(Object object) {
// Log.d(TAG, "getItemPosition");
// return POSITION_NONE;
// }
// });
}
static public ViewModel1 obtainViewModel1(FragmentActivity activity) {
ViewModelFactory factory = ViewModelFactory.getInstance(activity.getApplication());
return ViewModelProviders.of(activity, factory).get(ViewModel1.class);
}
static public ViewModel2 obtainViewModel2(FragmentActivity activity) {
ViewModelFactory factory = ViewModelFactory.getInstance(activity.getApplication());
return ViewModelProviders.of(activity, factory).get(ViewModel2.class);
}
@BindingAdapter({"bind:handler"})
public static void bindViewPagerAdapter(final ViewPager view, final MainActivity activity) {
Log.d(TAG, "bindViewPagerAdapter");
final MainSectionFragmentStatePagerAdapter adapter = new MainSectionFragmentStatePagerAdapter(view.getContext(), activity.getSupportFragmentManager());
view.setAdapter(adapter);
}
}
Fragment1. java
package com.jone.tablayouttest;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.jone.tablayouttest.databinding.Layout1Binding;
import com.jone.tablayouttest.databinding.Layout1BindingImpl;
public class Fragment1 extends Fragment {
private static Fragment1 INSTANCE = new Fragment1();
public static Fragment1 newInstance() {
return INSTANCE;
}
private Layout1Binding mBinding;
private ViewModel1 mViewModel;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// Inflate the layout for this fragment
mBinding = Layout1BindingImpl.inflate(getLayoutInflater(), container, false);
mViewModel = MainActivity.obtainViewModel1(getActivity());
mBinding.setViewmodel(mViewModel);
mBinding.setLifecycleOwner(this);
return mBinding.getRoot();
}
}
ViewModel1. java
package com.jone.tablayouttest;
import android.app.Application;
import android.arch.lifecycle.AndroidViewModel;
import android.arch.lifecycle.MutableLiveData;
import android.databinding.ObservableBoolean;
import android.databinding.ObservableField;
import android.support.annotation.NonNull;
public class ViewModel1 extends AndroidViewModel {
public final ObservableBoolean value = new ObservableBoolean();
public final ObservableField<String> text = new ObservableField<>();
public ViewModel1(@NonNull Application application) {
super(application);
value.set(true);
text.set("abd");
}
}
Адаптер:
package com.jone.tablayouttest;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.view.ViewGroup;
public class MainSectionFragmentStatePagerAdapter extends FragmentStatePagerAdapter {
Context mCtx;
public MainSectionFragmentStatePagerAdapter(final Context context, FragmentManager fm) {
super(fm);
mCtx = context.getApplicationContext();
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return Fragment1.newInstance();
case 1:
return Fragment2.newInstance();
}
return null;
}
@Override
public int getItemPosition(@NonNull Object object) {
return super.getItemPosition(object);
}
@Override
public int getCount() {
return 2;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "1";
case 1:
return "2";
}
return "";
}
}
main_activity. xml
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
<data>
<variable
name="handler"
type="com.jone.tablayouttest.MainActivity" />
<variable
name="manager"
type="android.support.v4.app.FragmentManager" />
</data>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.view.ViewPager
android:id="@+id/vp_content"
android:layout_width="match_parent"
android:layout_height="0dp"
app:handler="@{handler}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
</layout>
layout1. xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="viewmodel"
type="com.jone.tablayouttest.ViewModel1" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<CheckBox
android:id="@+id/checkBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="@{viewmodel.value}"
android:text="CheckBox1" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewmodel.text}" />
</LinearLayout>
</layout>
Fragment2. java и layou2. xml почти такие же, как здесь. Так что я не вставляю их сюда. Спасибо.