使用数据绑定库通过屏幕旋转保留EditText

问题描述 投票:0回答:1

我有两个类别AdminPinActivity.ktAdminPinActivityPresenter.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值。但是在屏幕旋转时也丢失了。

希望您能理解这个问题。

我到处搜索了将近两天,找不到解决方案。我不想使用双向数据绑定。

kotlin mvvm android-databinding android-savedstate viewmodel-savedstate
1个回答
0
投票

我正在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的值。

© www.soinside.com 2019 - 2024. All rights reserved.