Android MVVM 数据绑定 EditText 值在片段中丢失 onConfigurationChanged

Android MVVM Databinding EditText value lost onConfigurationChanged in Fragment

我在片段中使用数据绑定时遇到问题。

小问题:当我更改 phone 方向时,在我的 EditText 中输入的值丢失。

详情:首先我的片段是通过导航组件创建的。所以我的 activity 看起来像这样:

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    private lateinit var navController: NavController

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        navController = findNavController(R.id.my_nav_host_fragment)
    }
}

所以我到达了第一个片段(列表),列表的每个元素都有编辑按钮。然后你点击“编辑”,你就进入了第二个片段。问题就在这里。这是一个简单的表单,包含一个 EditText 和一些其他信息。

我正在尝试这样的双向数据绑定:

<?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="myViewModel"
            type="my.package.name.MyViewModel" />

    </data>
[...]

    <EditText 
        [...]
        android:text="@={myViewModel.name}"
        [...] />
[...]

在我的 ViewModel 中:

class MyViewModel @Inject constructor(
    private val repo: MyRepository
) : ViewModel() {
    val name = MutableLiveData<String?>()
    //rest of the ViewModel

终于在我的片段中:

@AndroidEntryPoint
class MyFragment : Fragment() {

    private lateinit var binding: MyFragmentBinding
    private var myObject: myObject? = null

    @Inject
    lateinit var myViewModel: MyViewModel

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {

        val safeArgs: MyFragmentArgs by navArgs()
        myObject = safeArgs.myObject

        binding = DataBindingUtil.inflate(
            inflater,
            R.layout.my_fragment,
            container,
            false
        )

        binding.lifecycleOwner = this
        binding.myViewModel = myViewModel

        return binding.root
    }

在我的片段中,我有一个要保存的按钮,如果我在我的 EditText 中输入“example”,然后单击该按钮,我的 ViewModel 中的值就可以了,我得到“example”。

但我的问题是:如果我输入“example”然后将我的 phone 横向 EditText 中的值丢失

我尝试调试并发现当我旋转 phone 时,我再次转到片段的“onCreateView”。所以我的猜测是我重新创建了一个新的 ViewModel...

如有任何帮助,我们将不胜感激!提前致谢!

应该是

@HiltViewModel
class MyViewModel @Inject constructor(
    private val repo: MyRepository
) : ViewModel() {

private val myViewModel by viewModels<MyViewModel>()