【问题标题】:how to access the extra data in the returned intent and update TextView in Android如何访问返回的意图中的额外数据并在 Android 中更新 TextView
【发布时间】:2021-04-03 13:42:17
【问题描述】:

我正在尝试更新第一个活动中的值。为了这。我已经通过意图和更新文本输入将参数从第一个 Activity 传递到第二个。现在我想将更新后的值传递给第一个 Activity 并更新特定值。我尝试使用 setResult() 方法在 saveButton onClick 内发送数据。并使用 onActivityResult() 方法在 FirstActivity 中获取值。但它不会更新值。你能检查一下我在哪里做错了吗?

第一个活动

class ShowProfileActivity : AppCompatActivity() {

    private lateinit var fullnameTv: TextView
    private lateinit var nicknameTv: TextView
    private lateinit var locationTv: TextView
    private lateinit var emailTv: TextView
    private lateinit var bioTv: TextView

    // todo load from sp
    private val mockUser: User? = User("TestName", "test", "test@gmail.com", "Italy", "this is a mocked bio")

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

        fullnameTv = findViewById(R.id.asp_user_name_tv)
        nicknameTv = findViewById(R.id.asp_user_nickname_tv)
        locationTv = findViewById(R.id.asp_user_location_tv)
        emailTv = findViewById(R.id.asp_user_email_tv)
        bioTv = findViewById(R.id.asp_user_bio_tv)


        // init views with user data
        fullnameTv.text = mockUser?.fullname
        nicknameTv.text = mockUser?.nickname
        locationTv.text = mockUser?.location
        emailTv.text = mockUser?.email
        bioTv.text = mockUser?.bio




        var editButton = findViewById<ImageButton>(R.id.editBtn);
        editButton.setOnClickListener {
            editProfile();
        }
    }

    fun editProfile() {
        val intent = Intent(this@ShowProfileActivity,EditProfileActivity::class.java)
        if (mockUser != null) {
            intent.putExtra("group23.lab1.user_fullname", mockUser.fullname)
            intent.putExtra("group23.lab1.user_nickname", mockUser.nickname)
            intent.putExtra("group23.lab1.user_location", mockUser.location)
            intent.putExtra("group23.lab1.user_email", mockUser.email)
            intent.putExtra("group23.lab1.user_bio", mockUser.bio)
        }
        startActivityForResult(intent, 1)
        startActivity(intent)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if(resultCode == Activity.RESULT_OK){
            if (data != null) {
                if (mockUser != null) {
                    mockUser.fullname= data.getStringExtra("group23.lab1.user_fullname").toString() //not updated
                }
            }
        }

    }





    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.show_profile_menu, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
            R.id.menu_show_profile_edit -> {
                /*
                TODO start edit profile activity (check activity name)
                val intent = Intent(this, com.group23.lab1.EditProfileActivity::class.java).apply {
                    if (mockUser != null) {
                        putExtra("group23.lab1.user_fullname", mockUser.fullname)
                        putExtra("group23.lab1.user_nickname", mockUser.nickname)
                        putExtra("group23.lab1.user_location", mockUser.location)
                        putExtra("group23.lab1.user_email", mockUser.email)
                        putExtra("group23.lab1.user_bio", mockUser.bio)
                    }
                }
                startActivityForResult(intent)
                */
                Toast.makeText(this, "OPEN EDIT PROFILE", Toast.LENGTH_SHORT).show()
                true
            }
            else -> super.onOptionsItemSelected(item)
        }
    }
}

第二个活动


class EditProfileActivity : AppCompatActivity() {

    private lateinit var fullnameTv: TextView
    private lateinit var nicknameTv: TextView
    private lateinit var locationTv: TextView
    private lateinit var emailTv: TextView
    private lateinit var bioTv: TextView


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

        val intent = intent

        fullnameTv = findViewById(R.id.asp_user_name_tv)
        nicknameTv = findViewById(R.id.asp_user_nickname_tv)
        locationTv = findViewById(R.id.asp_user_location_tv)
        emailTv = findViewById(R.id.asp_user_email_tv)
        bioTv = findViewById(R.id.asp_user_bio_tv)
//        ageTv = findViewById(R.id.asp_user_age_tv)

        fullnameTv.text = intent.getStringExtra("group23.lab1.user_fullname")
        nicknameTv.text = intent.getStringExtra("group23.lab1.user_nickname")
        locationTv.text = intent.getStringExtra("group23.lab1.user_location")
        emailTv.text = intent.getStringExtra("group23.lab1.user_email")
        bioTv.text = intent.getStringExtra("group23.lab1.user_bio")



        var sharedPreferences = getSharedPreferences("SHARED_PREF", Context.MODE_PRIVATE)
        var editor = sharedPreferences.edit()

        var saveButton = findViewById<Button>(R.id.btnSave)

        val name = sharedPreferences.getString("group23.lab1.user_fullname", null)
        val nickName = sharedPreferences.getString("group23.lab1.user_nickname", null)
        val location = sharedPreferences.getString("group23.lab1.user_location", null)
        val email = sharedPreferences.getString("group23.lab1.user_emai", null)
        val bio = sharedPreferences.getString("group23.lab1.user_bio", null)

        fullnameTv.text = name
        nicknameTv.text = nickName
        locationTv.text = location
        emailTv.text = email
        bioTv.text = bio

        saveButton.setOnClickListener {

            val name = fullnameTv.text.toString()
            val nickName = nicknameTv.text.toString()
            val location = locationTv.text.toString()
            val email = emailTv.text.toString()
            val bio = bioTv.text.toString()
//            var age = ageTv.text.toString()

            editor.apply {
                putString("group23.lab1.user_fullname", name)
                putString("group23.lab1.user_nickname", nickName)
                putString("group23.lab1.user_location", location)
                putString("group23.lab1.user_email", email)
                putString("group23.lab1.user_bio", bio)
                apply();
                setResult(RESULT_OK, intent);
                finish();

            }
        }




    }

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.show_profile_menu, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
            R.id.menu_show_profile_edit -> {


                Toast.makeText(this, "OPEN EDIT PROFILE", Toast.LENGTH_SHORT).show()
                true
            }
            else -> super.onOptionsItemSelected(item)
        }
    }

}


【问题讨论】:

  • 尝试删除此行 startActivity(intent) 在您的 firstActivity 中仅保留 startActivityForResult()
  • 是的,我删除了,但问题与此无关
  • 我没有看到你在调用setResult()之前在第二个活动一中更改了参数的地方
  • 我认为您发送了相同的 Intent,这就是您的结果没有改变的原因
  • 我尝试在 saveButton.setOnClickListener 内部进行更改。编辑器。申请。当我更改时,它在 secondActivity 中可见

标签: android kotlin android-intent


【解决方案1】:

您开始活动 2 次:

startActivityForResult(意图, 1) 开始活动(意图)

【讨论】:

  • 是的,我注意到了,谢谢。我删除了,但还是同样的问题
  • 在调用 setResult(RESULT_OK, intent) 之前您不会更改意图,因此您只需返回在第二个活动中发送的相同意图。
【解决方案2】:

您的问题的症结在于您要传回第二个活动的原始意图,该意图具有来自第一个活动的原始值。您需要使用新数据传回新意图。

// Return a NEW intent with NEW data, not this Activity's current intent
val resultIntent = Intent().putString("group23.lab1.user_fullname", name) 
setResult(RESULT_OK, resultIntent);

除此之外,还有一些不请自来的建议:

1 - 删除多余的 startForActivity:

startActivityForResult(intent, 1)
startActivity(intent) // <- Delete this

2 - 检查 onActivityResult 中的相同意图代码。这可确保您处理正确的结果。对你来说没关系,因为你只有一个结果,但养成这种习惯并保持正确是件好事。因此,既然您从 requestCode 1 开始,请在结果中检查相同的值:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
        if(resultCode == Activity.RESULT_OK && requestCode == 1) { // Check for same request code
            if (data != null) {
                if (mockUser != null) {
                    mockUser.fullname= data.getStringExtra("group23.lab1.user_fullname").toString() //not updated
                }
            }
        }
    }

3 - 保存一个名为“intent”的本​​地 val 来隐藏 Activity 自己的“intent”属性是多余的。

val intent = intent // Delete this - it's pointless

4 - 您在第二个活动中设置了两次值 - 从意图开始,然后用共享首选项覆盖它。选择一个。

// Setting values here from Intent ...
fullnameTv.text = intent.getStringExtra("group23.lab1.user_fullname")
nicknameTv.text = intent.getStringExtra("group23.lab1.user_nickname")
locationTv.text = intent.getStringExtra("group23.lab1.user_location")
emailTv.text = intent.getStringExtra("group23.lab1.user_email")
bioTv.text = intent.getStringExtra("group23.lab1.user_bio")

var sharedPreferences = getSharedPreferences("SHARED_PREF", Context.MODE_PRIVATE)
var editor = sharedPreferences.edit()

var saveButton = findViewById<Button>(R.id.btnSave)

val name = sharedPreferences.getString("group23.lab1.user_fullname", null)
val nickName = sharedPreferences.getString("group23.lab1.user_nickname", null)
val location = sharedPreferences.getString("group23.lab1.user_location", null)
val email = sharedPreferences.getString("group23.lab1.user_emai", null)
val bio = sharedPreferences.getString("group23.lab1.user_bio", null)

// ... get completely overwritten here ... so setting them above is pointless
fullnameTv.text = name
nicknameTv.text = nickName
locationTv.text = location
emailTv.text = email
bioTv.text = bio

5 - 与上述相关,您似乎在混合和匹配意图和共享偏好。除非您确实需要将此数据作为“首选项”保存到磁盘,否则您应该删除令人困惑的共享首选项逻辑。另一方面,如果您确实需要持久化数据,那么您可以通过 Intent 删除数据的传递,因为它最终是多余的。

例如,您的活动结果可以改为从共享偏好中读取:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
        if(resultCode == Activity.RESULT_OK && requestCode == 1) { // Check for same request code
            if (mockUser != null) {
                var sharedPreferences = getSharedPreferences("SHARED_PREF", Context.MODE_PRIVATE)
                mockUser.fullname= sharedPreferences.getString("group23.lab1.user_fullname", "")
            }
        }
    }

请注意,如果您选择使用首选项,则应使用同步的Editor.commit() 而不是异步的Editor.apply(),以确保您的值可以立即被下一个活动读取。

【讨论】:

    猜你喜欢
    • 2015-02-27
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多