Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从活动导航回片段后,数据绑定行为中断_Android_Android Databinding_Android Architecture Components - Fatal编程技术网

Android 从活动导航回片段后,数据绑定行为中断

Android 从活动导航回片段后,数据绑定行为中断,android,android-databinding,android-architecture-components,Android,Android Databinding,Android Architecture Components,最近我在玩Android架构组件和数据绑定库,我遇到了一个非常奇怪的情况,在网上搜索并尝试了几天不同的事情后,我决定来这里寻求帮助 我在一个活动中有一个片段,我必须对片段的绑定执行setLifeCycleOwner(fragment),这使得绑定生命周期能够感知。片段中有一个复选框和一个按钮,其中: 应根据检查状态更改复选框的文本 按钮回调通过statrActivityForResult启动活动B 我面临的问题是从活动B返回时,复选框显示的文本不再更新。 我已经选中了回调复选框(onChecke

最近我在玩Android架构组件和数据绑定库,我遇到了一个非常奇怪的情况,在网上搜索并尝试了几天不同的事情后,我决定来这里寻求帮助

我在一个活动中有一个片段,我必须对片段的绑定执行
setLifeCycleOwner(fragment)
,这使得绑定生命周期能够感知。片段中有一个复选框和一个按钮,其中:
应根据检查状态更改复选框的文本
按钮
回调通过
statrActivityForResult启动活动B

我面临的问题是从活动B返回时,复选框显示的文本不再更新。
我已经选中了回调复选框(onCheckedChanged),回调工作正常,显示文本的模型也更新了数据绑定没有收到字段更改事件,因此UI没有更新。

有人有或曾经有过这个问题吗?还有什么我没查到的吗?
如果我需要提供任何信息,请告诉我。谢谢你的帮助


以下是本案例中涉及的示例:

activity.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <FrameLayout
        android:id="@+id/main_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</layout>
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:bind="http://schemas.android.com/tools">

    <data>

        <variable
            name="viewModel"
            type="za.co.travelstart.flapp.activities.test.TestViewModel" />
    </data>

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <include
            layout="@layout/section_test"
            bind:viewModel="@{viewModel}" />
    </android.support.constraint.ConstraintLayout>
</layout>
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

        <variable
            name="viewModel"
            type="za.co.travelstart.flapp.activities.test.TestViewModel" />
    </data>

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <CheckBox
            android:id="@+id/checkBox"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onCheckedChanged="@{(compoundButton, isChecked) -> viewModel.onCheckBoxCheckedChanged(isChecked)}"
            android:text="@{viewModel.testModel.checkBoxText}"
            app:layout_constraintTop_toTopOf="parent" />

        <Button
            android:id="@+id/button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="@{(v) -> viewModel.onButtonClicked()}"
            android:text="Start Test B"
            app:layout_constraintTop_toBottomOf="@id/checkBox" />
    </android.support.constraint.ConstraintLayout>
</layout>
TestViewModel.kt

class TestActivity : ParentActivity() {

    // View Model
    private lateinit var mViewModel: TestViewModel

    /* ------------------------------- Life Cycle */

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // init view model
        initViewModel()
        // init binding
        initBinding()
        // observe data
        observeData()
        // init fragment utils
        initFragmentUtils()
        // display fragment
        displayFragment()
    }

    override fun onActivityResult(requestCode: Int,
                                  resultCode: Int,
                                  data: Intent?) {
        when (requestCode) {
            1337 -> {
                // do nothing
            }
        }
    }

    /* ------------------------------- Methods */

    /**
     * Init view model
     */
    private fun initViewModel() {
        mViewModel = ViewModelProviders
                .of(this)
                .get(TestViewModel::class.java)
    }

    /**
     * Init binding
     */
    private fun initBinding() {
        DataBindingUtil.setContentView<ActivityTestBinding>(
                this, R.layout.activity_test).apply {
            setLifecycleOwner(this@TestActivity)
        }
    }

    /**
     * Observe the data in view model
     */
    private fun observeData() {
        mViewModel.buttonTriggerLiveData.observe(this, Observer {
            // navigate to test b
            navigateToTestB()
        })
    }

    /**
     * Display test fragment
     */
    private fun displayFragment() {
        fragmentUtils.displayTest()
    }

    /**
     * Navigate to test B
     */
    private fun navigateToTestB() {
        startActivityForResult(Intent(this, TestActivityB::class.java), 1337)
    }
}
class TestFragment : Fragment() {

    // View Model
    private lateinit var mViewModel: TestViewModel

    // Binding
    private lateinit var mBinding: FragmentTestBinding

    /* ------------------------------ Instance Factory */

    companion object {

        /**
         * Instance factory
         */
        fun newInstance() = TestFragment()
    }

    /* ------------------------------ Life Cycle */

    override fun onCreateView(inflater: LayoutInflater,
                              container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        // init view model
        initViewModel()
        // init data binding
        initBinding(inflater, container)
        // return binding root view
        return mBinding.root
    }

    /* ------------------------------ Methods */

    /**
     * Init view model
     */
    private fun initViewModel() {
        activity?.also {
            mViewModel = ViewModelProviders
                    .of(it)
                    .get(TestViewModel::class.java)
        }
    }

    /**
     * Init binding
     */
    private fun initBinding(inflater: LayoutInflater,
                            container: ViewGroup?) {
        mBinding = DataBindingUtil.inflate(
                inflater, R.layout.fragment_test, container, false)
        mBinding.apply {
            viewModel = mViewModel
            setLifecycleOwner(this@TestFragment)
        }
    }
}
class TestViewModel : ViewModel() {

    // Data
    val testModel: MutableLiveData<TestModel> = MutableLiveData()

    // Button callback trigger
    val buttonTriggerLiveData: MutableLiveData<Boolean> = MutableLiveData()

    init {
        testModel.value = TestModel()
    }

    /**
     * Callback for checkbox
     */
    fun onCheckBoxCheckedChanged(isChecked: Boolean) {
        testModel.value?.checkBoxText = if (isChecked) "checked" else "unchecked"
    }

    /**
     * Callback for button
     */
    fun onButtonClicked() {
        buttonTriggerLiveData.value = true
    }
}
class TestModel : BaseObservable() {
    var checkBoxText = "unclicked"
        @Bindable get() = field
        set(value) {
            field = value
            notifyPropertyChanged(BR.checkBoxText)
        }
}