我有两个类别AdminPinActivity.kt
和AdminPinActivityPresenter.kt
AdminPinActivity.kt:
class AdminPinActivity : InjectableAppCompatActivity() {
@Inject
lateinit var adminPinActivityPresenter: AdminPinActivityPresenter
private var input_Pin: String = ""
private var input_Confirm_Pin: String = ""
companion object {
fun createAdminPinActivityIntent(context: Context, profileId: Int, colorRgb: Int): Intent {
val intent = Intent(context, AdminPinActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
intent.putExtra(KEY_ADMIN_PIN_PROFILE_ID, profileId)
intent.putExtra(KEY_ADMIN_PIN_COLOR_RGB, colorRgb)
return intent
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activityComponent.inject(this)
adminPinActivityPresenter.handleOnCreate(savedInstanceState)
}
override fun onSaveInstanceState(outState: Bundle) {
adminPinActivityPresenter.handleOnSavedInstanceState(outState)
super.onSaveInstanceState(outState)
}
override fun onSupportNavigateUp(): Boolean {
finish()
return false
}
}
AdminPinActivityPresenter.kt:
/** The presenter for [AdminPinActivity]. */
@ActivityScope
class AdminPinActivityPresenter @Inject constructor(
private val context: Context,
private val activity: AppCompatActivity,
private val profileManagementController: ProfileManagementController,
private val viewModelProvider: ViewModelProvider<AdminPinViewModel>
) {
private val adminViewModel by lazy {
getAdminPinViewModel()
}
private var input_Pin: String = ""
private var input_Confirm_Pin: String = ""
/** Binds ViewModel and sets up text and button listeners. */
fun handleOnCreate(savedInstanceState: Bundle?) {
activity.title = activity.getString(R.string.add_profile_title)
activity.supportActionBar?.setDisplayHomeAsUpEnabled(true)
activity.supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_close_white_24dp)
val binding =
DataBindingUtil.setContentView<AdminPinActivityBinding>(activity, R.layout.admin_pin_activity)
binding.apply {
lifecycleOwner = activity
viewModel = adminViewModel
}
if (savedInstanceState != null) {
if (savedInstanceState.getString("InputPin") != null) {
Log.i("Input pin from savedInstanceState",savedInstanceState.getString("InputPin"))
binding.inputPin.input.setText(savedInstanceState.getString("InputPin"))
}
if (savedInstanceState.getString("InputConfirmPin") != null) {
binding.inputConfirmPin.input.setText(savedInstanceState.getString("InputConfirmPin"))
}
binding.executePendingBindings()
}
binding.inputPin.addTextChangedListener(object :TextWatcher{
override fun afterTextChanged(p0: Editable?) {}
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
}
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
input_Pin=p0.toString().trim()
}
})
binding.inputConfirmPin.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(p0: Editable?) {
input_Confirm_Pin=p0.toString().trim()
}
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
}
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
}
})
}
fun handleOnSavedInstanceState(bundle: Bundle) {
bundle.putString("InputPin", input_Pin)
Log.i("input_Pin",input_Pin)
bundle.putString("InputConfirmPin", input_Confirm_Pin)
}
private fun getAdminPinViewModel(): AdminPinViewModel {
return viewModelProvider.getForActivity(activity, AdminPinViewModel::class.java)
}
}
Log.i("Input pin from savedInstanceState",savedInstanceState.getString("InputPin"))
和Log.i("input_Pin",input_Pin)
每次旋转都会记录。这意味着代码可以正常工作,但是EditText值没有得到更新,即binding.inputPin.input.setText(savedInstanceState.getString("InputPin"))
和binding.inputConfirmPin.input.setText(savedInstanceState.getString("InputConfirmPin"))
无法正常工作。
[当我在if语句外(即handleOnCreateMethod内)使用binding.inputPin.input.setText("Something")
时,它将一次使用“某些内容”更新EditText值。但是在屏幕旋转时也丢失了。
希望您能理解这个问题。
我到处搜索了将近两天,找不到解决方案。我不想使用双向数据绑定。
我正在AdminPinActivityPresenter中编写此方法
fun handleOnRestoreInstanceState(bundle: Bundle?) {
val binding =
DataBindingUtil.setContentView<AdminPinActivityBinding>(activity, R.layout.admin_pin_activity)
binding.apply {
lifecycleOwner = activity
viewModel = adminViewModel
}
binding.inputPin.input.setText(input_Pin)
binding.inputPin.input.setText(input_Confirm_Pin)
}
还有AdminPinActivity中的这个
override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
super.onRestoreInstanceState(savedInstanceState)
adminPinActivityPresenter.handleOnRestoreInstanceState(savedInstanceState)
}
我没有使用onsavedinstancestate方法,但是它只保留InputConfirmPin Edittext的值,而不保留InputPin Edittext的值。并在旋转屏幕时在inputPin中复制Inputconfirm的值。