当前位置: 首页 > 知识库问答 >
问题:

如何从另一个活动中获取活动中的变量,并使主活动在从那里初始化后使用变量?(科特林)

艾英范
2023-03-14

我的kotlin项目有两个activitis(main,第二个名为:AddPlayer)。main活动有一个名为“添加播放器”的按钮,它启动第二个活动。在第二个活动中,我有两个编辑文本来获得一个数字和一个来自用户的文本。在第二个活动中按下提交按钮后,在主活动中,我想将这些值添加到我的可变列表中,但idk如何操作(我认为它崩溃了,因为主活动在从用户获取值之前使用了这些变量)plz指导我。

我的活动代码:

class MainActivity : AppCompatActivity() {
private var enteredPlayerNumber = 0
 private var enteredPlayerName: String=""

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    val myRecyclerView = findViewById<RecyclerView>(R.id.recyclerView)
    val myViewModel = ViewModel()
    val btnAdd = findViewById<Button>(R.id.btnAdd)



    myRecyclerView.layoutManager = LinearLayoutManager(this)

    myViewModel.getUserData()
    btnAdd.setOnClickListener {
        val myIntent = Intent(this, AddPlayerActivity::class.java)
        startActivity(myIntent)
    }




    myViewModel.myList.observe(this) {
        myRecyclerView.adapter = MyAdapter(it)
    }


}}

我的第二项活动是:

class AddPlayerActivity : AppCompatActivity() {


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

    val numberAddPlayer = findViewById<EditText>(R.id.etNumberAdd2)
    val nameAddPlayer = findViewById<EditText>(R.id.etNameAdd2)

    val btn = findViewById<Button>(R.id.btnSubmitAdd2)



    btn.setOnClickListener {
        val myIntent=Intent(this,MainActivity::class.java)
        myIntent.putExtra("USERNAME", nameAddPlayer.text)
        myIntent.putExtra("USER_NUMBER", numberAddPlayer.text)
        startActivity(myIntent)

    }

}}

共有1个答案

高峻
2023-03-14

如果您想从用于启动活动Intent中提取数据,只需在您的onCreate中执行此操作:

intent?.run {
    val userName = getStringExtra("USERNAME")
    val userNumber = getStringExtra("USER_NUMBER")

    if (username != null && userNumber != null {
        // do whatever with that data
    }
}

您需要空值检查,因为这些值可能不存在,例如,如果Mainactive是通过启动应用程序启动的,而不是通过在AddPlayeractive中单击的按钮启动的。

此外,如果您单击按钮并返回到主活动,然后将应用程序放在后台,然后它被销毁,当重新创建时,onCreate将再次运行,看到相同的意图(最后一个在重新创建状态时保留),它将提取值并再次使用它们。如果这意味着要向列表中添加一些内容,则可能会得到重复的内容

避免这种情况的一种方法是检查savedInstanceState是否为空-如果为空,则表示您是以全新的方式进入活动,因此可以检查意图。如果不为null,则您正在从已打开的活动中重新创建一些保存的状态,因此您不想重复检查

override fun onCreate(savedInstanceState: Bundle?) {
    ...
    if (savedInstanceState == null) {
        // do the intent stuff
    }

但这可能取决于您对活动和任务后栈所做的事情——测试它以确保它正在做您期望的事情!

Android开发人员在这一点上推荐的方法是单活动架构,其中不是每个屏幕的活动,而是只有一个,并为您的屏幕使用片段s并交换它们进出代替。

许多Jetpack组件都是围绕这一想法设计的,包括导航库和ViewModels,它们允许共享活动的片段也共享数据的中央存储并对变化做出反应。

看起来您已经在使用一个视图模型,但是通过共享一个活动,您可以让您的AddPlayer片段执行类似模型的操作。添加用户(名称、编号)。如果需要,该模型可以存储该新用户(例如,在数据库中,或共享引用中或其他任何地方),并更新其显示的数据MainFragment可以观察该数据,并根据需要更新其显示

用这种方式做事更容易推理,你不需要担心活动状态等(创建视图模型的部分原因是你需要做很多工作),这是编写Android应用程序的一种更现代的方式。可能值得一看!

 类似资料:
  • 在我的程序中,我有一个当应用程序打开时启动的活动。如果我再打开几个活动,我怎么能回到主活动?在意图过滤器中,活动的名称是“android.intent.action.MAIN”,它不允许我在上面调用start Active()。我该怎么办?

  • 我有两个活动,活动A和活动B。活动a显示列表,活动B显示列表的详细信息。我在ActivityB上有一些变量,我想在运行时更改这些变量以测试结果。我无法直接测试ActivityB,因为ActivityB从ActivityA填充/收集数据。因此,从活动A开始,我要去活动B。现在如何设置ActivityB上的变量值。请帮助我。<br>在机器人测试类中。 这方面请专家帮我一下。谢谢!< br > @是的。

  • 我刚接触Android,有一个带有片段的选项卡布局,我有一个编辑文本字段,它是在我的父活动中声明的,我想检查编辑文本字段是否为空,是否来自片段。我该怎么做呢?这是我做的,但它显示了错误。这是我的主要活动编辑文本字段: 这是我的片段活动: 这是我的日志:

  • 问题内容: 在我的Android应用程序中,我有一个奇怪的错误。像下面这样的实例变量在运行时意外分配给它的默认值(在这种情况下为false)。何时在Android活动中初始化此类变量? 问题答案: 创建实例时,将初始化Java中的实例变量。 大多数情况下,对象会使用实例化。 对于活动,它们由Android框架使用反射实例化(请参阅参考资料)。然后执行的初始化,并在实例上调用活动。 有关详细信息,请

  • 我有两个模块。应用程序和模块测试。模块应用程序包含带按钮的主活动。模块测试包含主要活动二。我想通过点击按钮从模块应用程序运行Test/MainActivity。但Android仍然无法从模块测试中看到主要活动。见下文。 模块应用清单: 模块测试清单: 在模块app MainActivity中为单击按钮和运行第二个活动编码: 在控制台我得到一个错误: 带系统。错误:java。lang.ClassNo

  • 问题内容: 有人知道如何从其他活动中关闭一个活动吗?例如:我有3个活动(活动A,B和C),并且可以从活动C中关闭活动A。我的活动结构是活动A->活动B->活动C如何从中关闭活动A活动C? 我曾尝试此代码: 但是该代码只能关闭活动B的活动A,而不能直接关闭活动C的活动A。 有谁知道直接从其他活动关闭活动?谢谢.. 问题答案: