Kotlin Android开始新的活动

J A*_*dag 75 android-layout android-activity kotlin android-studio

我想在Android上开始另一项活动,但我收到此错误:

请指定构造函数调用; 分类器'Page2'没有伴侣对象

在实例化Intent类之后.我该怎么做才能纠正错误?我的代码:

class MainActivity : AppCompatActivity() {

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

    fun buTestUpdateText2 (view: View) {
        val changePage = Intent(this, Page2) 
        // Error: "Please specify constructor invocation; 
        // classifier 'Page2' does not have a companion object"

        startActivity(changePage)
    }

}
Run Code Online (Sandbox Code Playgroud)

Rah*_*hul 142

Activity在我们编写的java中启动Intent(this, Page2.class),基本上你必须Context在第二个参数中定义第一个参数和目标类.根据Intent源代码中的方法 -

 public Intent(Context packageContext, Class<?> cls)
Run Code Online (Sandbox Code Playgroud)

如您所见,我们必须Class<?>在第二个参数中传递类型.

通过写作,Intent(this, Page2)我们永远不会指定我们要传递类,我们试图传递class不可接受的类型.

使用::class.java哪种替代.classkotlin.使用以下代码启动您的Activity

Intent(this, Page2::class.java)
Run Code Online (Sandbox Code Playgroud)

示例 -

val intent = Intent(this, NextActivity::class.java)
// To pass any data to next activity
intent.putExtra("keyIdentifier", value)
// start your next activity
startActivity(intent)
Run Code Online (Sandbox Code Playgroud)

  • 知道为什么他们将其更改为 `::class.java` 而不是 `.class` 吗?与 Java 相比,Kotlin 方法异常复杂。 (7认同)
  • @Mr-IDE `class` 返回一个 Kotlin `KClass`,但 Android 需要一个 Java `Class&lt;...&gt;`,因此是 `.java` 属性。 (5认同)

Gow*_*iam 27

你可以试试这个,

val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("key", value)
startActivity(intent)
Run Code Online (Sandbox Code Playgroud)

  • 您不需要使用 putExtra 方法来启动新活动。 (2认同)

leo*_*tin 25

要开始新的活动,

startActivity(Intent(this@CurrentClassName,RequiredClassName::class.java)
Run Code Online (Sandbox Code Playgroud)

所以将代码更改为:

class MainActivity : AppCompatActivity() {

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

    fun buTestUpdateText2 (view: View) {
        startActivity(Intent(this@MainActivity,ClassName::class.java))

        // Also like this 

        val intent = Intent(this@MainActivity,ClassName::class.java)
        startActivity(intent)
    }
Run Code Online (Sandbox Code Playgroud)

  • this@Activity 等于 Java 的 Activity.this :) (2认同)

Epi*_*rce 10

您通常可以BlahActivity::class.java通过定义内联的通用泛型函数来简化参数的规范.

inline fun <reified T: Activity> Context.createIntent() =
    Intent(this, T::class.java)
Run Code Online (Sandbox Code Playgroud)

因为那可以让你做到

startActivity(createIntent<Page2>()) 
Run Code Online (Sandbox Code Playgroud)

甚至更简单

inline fun <reified T: Activity> Activity.startActivity() {
    startActivity(createIntent<T>()) 
} 
Run Code Online (Sandbox Code Playgroud)

现在就是这样

startActivity<Page2>() 
Run Code Online (Sandbox Code Playgroud)


Adi*_*rzi 8

你必须给出类类型的第二个参数.你也可以像下面一样整洁一点.

startActivity(Intent(this, Page2::class.java).apply {
    putExtra("extra_1", value1)
    putExtra("extra_2", value2)
    putExtra("extra_3", value3)
})
Run Code Online (Sandbox Code Playgroud)


Alf*_*Moh 7

这是因为您的Page2类没有类似于staticJava 中的伴生对象,因此无法使用您的类。要将您的课程作为参数传递给Intent,您将必须执行以下操作

val changePage = Intent(this, Page2::class.java)
Run Code Online (Sandbox Code Playgroud)


小智 7

试试这个

val intent = Intent(this, Page2::class.java)
startActivity(intent)
Run Code Online (Sandbox Code Playgroud)


小智 6

这是我的主要活动,我从编辑文本和设置意图中获取用户名和密码

class MainActivity : AppCompatActivity() {
val userName = null
val password = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
    val intent = Intent(this@MainActivity,SecondActivity::class.java);
    var userName = username.text.toString()
    var password = password_field.text.toString()
    intent.putExtra("Username", userName)
    intent.putExtra("Password", password)
    startActivity(intent);
 }
}
Run Code Online (Sandbox Code Playgroud)

这是我的第二项活动,我必须从主要活动中获取价值

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
var strUser: String = intent.getStringExtra("Username")
var strPassword: String = intent.getStringExtra("Password")
user_name.setText("Seelan")
passwor_print.setText("Seelan")
}
Run Code Online (Sandbox Code Playgroud)


Saa*_*yem 6

好吧,我发现这 2 种方法是所有结果中最简单的:

方式#1:

accoun_btn.setOnClickListener {
            startActivity(Intent(this@MainActivity, SecondActivity::class.java))
        }
Run Code Online (Sandbox Code Playgroud)

方式#2:(以通用方式)

    accoun_btn.setOnClickListener {
        startActivity<SecondActivity>(this)
    }

    private inline fun <reified T> startActivity(context: Context) {
            startActivity(Intent(context, T::class.java))
        }
Run Code Online (Sandbox Code Playgroud)

样本


Mas*_*sum 5

从活动到活动

val intent = Intent(this, YourActivity::class.java)
startActivity(intent)
Run Code Online (Sandbox Code Playgroud)

从片段到活动

val intent = Intent(activity, YourActivity::class.java)
startActivity(intent)
Run Code Online (Sandbox Code Playgroud)