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>()
我在片段中使用数据绑定时遇到问题。
小问题:当我更改 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>()