package com.example.myapplication

import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity


class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        inputListner(MainActivity())

    }
}

fun inputListner(activity: MainActivity){
    // finding the edit text
    val editText = activity.findViewById<EditText>(R.id.link)
    val showButton = activity.findViewById<Button>(R.id.generate)

    // Setting On Click Listener
    showButton.setOnClickListener {

        // Getting the user input
        val text = editText.text

        // Showing the user input
        Toast.makeText(activity, text, Toast.LENGTH_SHORT).show()
    }
}

我在试着把我的代码分成几部分. 我想做的第一件事是创建一个函数来处理我的按钮和编辑文本.据我所知,我需要以某种方式将类的参数传递给函数.

实际上这段代码可以编译,但在我的手机上它崩溃了.

比起我做的另一件事:

package com.example.myapplication

import android.content.Context
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity


class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val editText = findViewById<EditText>(R.id.link)
        val showButton = findViewById<Button>(R.id.generate)
        val MAContext: Context = this@MainActivity
        inputListner(showButton, editText, MAContext )

    }
}

fun inputListner(showButton: Button, editText: EditText, context: Context){
    // finding the edit text


    // Setting On Click Listener
    showButton.setOnClickListener {

        // Getting the user input
        val text = editText.text

        // Showing the user input
        Toast.makeText(Context, text, Toast.LENGTH_SHORT).show()
    }
}

这里我需要传递一个上下文,但我收到了这个错误:

Classifier 'Context' does not have a companion object, and thus must be initialized here

我实际上有点困惑,因为这是我第一次编写应用程序并使用Kotlin.

有必要这样做吗?这是在应用程序中划分任务的适当方式吗?

你会建议我将来如何组织我的代码吗?

谢谢!

推荐答案

您永远不能自己实例化Activity类.这是由操作系统代表您进行管理和执行的.在这行代码中,您通过调用MainActivity的构造函数实例化了一个全新的实例:

 inputListner(MainActivity())

这说不通.您不需要新的活动实例.您需要使用操作系统提供给您的版本,因此您可以将其更改为:

inputListner(this)

在本例中,this是您已经处于的MainActivity实例.正是代码所在的位置在召唤它.

然而,您的基本方法有点奇怪和复杂.使用活动的UI片段的函数不需要在该活动之外.您应该将函数移动到活动内部,这样它就不需要MainActivity参数:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        inputListner()

    }

    private fun inputListner(){
        // finding the edit text
        val editText = findViewById<EditText>(R.id.link)
        val showButton = findViewById<Button>(R.id.generate)
    
        // Setting On Click Listener
        showButton.setOnClickListener {
    
            // Getting the user input
            val text = editText.text
    
            // Showing the user input
            Toast.makeText(this, text, Toast.LENGTH_SHORT).show()
        }
    }
}

根据功能来命名函数也是一种惯例,因此名称应该以动词开头.inputListner可能应该被命名为setUpShowButtonBehavior左右.


在问题的第二部分,您得到的错误是因为您试图使用大写的-CContext,就好像它是一个变量、属性或函数参数一样.你需要注意大写.您的函数参数的名称为小写-C context.

Android相关问答推荐

致命异常:java.lang. SecureExcellent::用户10021和当前进程都没有android. permissions.Change_WIFI_STATE

Android添加设置图标齿轮到应用程序信息

NativeScript在`ns run android`上重复Kotlin类

在Android 14/SDK 34中使用RegisterReceiver的正确方式是什么?

在Jetpack Compose中,如何判断屏幕是否已重新组合?

Android写/读二进制文件到共享存储

Android 14预测性背部手势-闪烁的白色背景色

有没有什么方法可以让Beeware在安卓手机上显示图片?

Android 12+BLE字节不同

制作圆形SupportMapFragment

如何在 compose 中使用可变对象?

Android kotlin 中闪屏 API 执行完成后如何根据身份验证将用户导航到特定屏幕

块不起作用,出现 "只有安全的 (?.)... " 错误

列表更改时,RecyclerView 中的列表不会更新

如果 auth 失败,如何显示 toast jetpack compose firebase if else @Composable 调用只能在 @Composable 函数的上下文中发生

单击过go 的文章时 NewsApp 崩溃

Android Transitions API - 在 24-48 小时后停止接收任何更新

删除项目时延迟列不更新

无法使用 Gradle 托管设备对基线配置文件运行测试

如何将房间数据库导出到 .CSV