Kotlin Android 启动新 Activity

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

我想在 Android 上启动另一个 Activity,但收到此错误:

请指定构造函数调用;分类器“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)
    }

}
android kotlin android-intent android-activity
20个回答
237
投票

要在java中启动

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

 public Intent(Context packageContext, Class<?> cls)

如您所见,我们必须在第二个参数中传递

Class<?>
类型。

通过编写

Intent(this, Page2)
,我们从未指定我们要通过课程,我们试图通过
class
类型,这是不可接受的。

使用

::class.java
,它是 kotlin 中
.class
的替代品。使用下面的代码来启动您的
Activity

Intent(this, Page2::class.java)

示例-

// start your activity by passing the intent
startActivity(Intent(this, Page2::class.java).apply {
    // you can add values(if any) to pass to the next class or avoid using `.apply`
    putExtra("keyIdentifier", value)
})

57
投票

您可以使用这个简单的方法在

Activity
中开始
KOTLIN

val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("key", value)
startActivity(intent)

35
投票

要启动新活动,

startActivity(Intent(this@CurrentClassName,RequiredClassName::class.java)

因此将您的代码更改为:

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)
    }

15
投票

您必须给出类类型的第二个参数。您还可以将其整理得更整洁,如下所示。

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

15
投票

您通常可以通过定义内联具体化泛型函数来简化参数的规范

BlahActivity::class.java

inline fun <reified T: Activity> Context.createIntent() =
    Intent(this, T::class.java)

因为这可以让你做

startActivity(createIntent<Page2>()) 

或者更简单

inline fun <reified T: Activity> Activity.startActivity() {
    startActivity(createIntent<T>()) 
} 

所以现在

startActivity<Page2>() 

10
投票

试试这个

val intent = Intent(this, Page2::class.java)
startActivity(intent)

9
投票

嗯,我发现这两种方法是所有结果中最简单的:

方式#1:

accoun_btn.setOnClickListener {
            startActivity(Intent(this@MainActivity, SecondActivity::class.java))
        }

方式#2:(通用方式)

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

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


7
投票

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

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);
 }
}

这是我的第二个活动,我必须从主要活动接收值

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")
}

6
投票

这是因为您的

Page2
类没有类似于 Java 中的
static
的伴生对象,因此无法使用您的类。要将你的类作为参数传递给
Intent
,你必须这样做

val changePage = Intent(this, Page2::class.java)

4
投票

从活动到活动

val intent = Intent(this, YourActivity::class.java)
startActivity(intent)

从片段到活动

val intent = Intent(activity, YourActivity::class.java)
startActivity(intent)

3
投票

导航到另一个活动的另一种简单方法是

Intent(this, CodeActivity::class.java).apply {
                    startActivity(this)
                }

3
投票
fun Context.launchActivity(
    cls: Class<*>,
    flags: Int = 0,
    intentTransformer: Intent.() -> Unit = {}
) {
    val intent = Intent(this, cls).apply {
        addFlags(flags)
        intentTransformer()
    }
    this.startActivity(intent)
}

2
投票

这个要考虑封装吗?

例如:


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

        val title = intent.getStringExtra(EXTRA_TITLE) ?: EXTRA_TITLE_DEFAULT

        supportFragmentManager.beginTransaction()
            .add(R.id.frame_layout_fragment, ContentsFragment.newInstance())
            .commit()
    }

    // Omit...

    companion object {

        private const val EXTRA_TITLE = "extra_title"
        private const val EXTRA_TITLE_DEFAULT = "No title"

        fun newIntent(context: Context, title: String): Intent {
            val intent = Intent(context, ContentsActivity::class.java)
            intent.putExtra(EXTRA_TITLE, title)
            return intent
        }
    }

1
投票
val intentAct: Intent = Intent(this@YourCurrentActivity, TagentActivity::class.java)
startActivity(intentAct)

1
投票

我有一个类似的问题,我开始用 Kotlin 编写我的应用程序,在我重写了我的一项活动后,我想看看是否有任何问题,问题是我不确定如何将意图从 java 文件发送到kotlin 文件。

在本例中,我在 kotlin (伴随对象)中创建了一个静态函数,该函数在使用 kotlin 类( “::class.java”)。

这是我的代码:

 //this code will be in the kotlin activity - SearchActivity
 companion object {

    fun newIntent(context: Context): Intent {
        return Intent(context, SearchActivity::class.java)
    }
}

    //this is how you call SearchActivity from MainActivity.java
Intent searchIntent = SearchActivity.Companion.newIntent(this);
startActivity(searchIntent);

1
投票

扩展功能

fun Activity.showToast(message: String, toastLength: Int){
    //LENGTH_SHORT = 0;
    //LENGTH_LONG = 1;
    Toast.makeText(this, message, toastLength).show()
}

fun Fragment.showToast(message: String, toastLength: Int){
    //LENGTH_SHORT = 0;
    //LENGTH_LONG = 1;
    Toast.makeText(requireContext(), message, toastLength).show()
}

fun Context.launchActivity(
    cls: Class<*>,
    flags: Int = 0,
    intentTransformer: Intent.() -> Unit = {}
) {
    val intent = Intent(this, cls).apply {
        addFlags(flags)
        intentTransformer()
    }
    this.startActivity(intent)
}

在活动通话中

showToast("message to be shown", 1)

在片段调用中

showToast("message to be shown", 1)

从任何地方开始活动

 launchActivity(MainActivity::class.java, Intent.FLAG_ACTIVITY_NEW_TASK)

Kotlin 扩展函数


0
投票

详情

  • Android Studio 3.1.4
  • Kotlin 版本:1.2.60

步骤1.申请()

获取您的应用程序上下文的链接

class MY_APPLICATION_NAME: Application() {

    companion object {
        private lateinit var instance: MY_APPLICATION_NAME
        fun getAppContext(): Context = instance.applicationContext
    }

    override fun onCreate() {
        instance = this
        super.onCreate()
    }

}

第2步.添加Router对象

object Router {
    inline fun <reified T: Activity> start() {
         val context =  MY_APPLICATION_NAME.getAppContext()
         val intent = Intent(context, T::class.java)
         context.startActivity(intent)
    }
}

使用方法

// You can start activity from any class: form Application, from any activity, from any fragment and other  
Router.start<ANY_ACTIVITY_CLASS>()

0
投票

记得将您想要展示的活动也添加到您的

AndroidManifest.xml
:-) 这对我来说就是问题。


0
投票

您可以在应用程序中使用 Kotlin 和 Java 文件。

要在两个文件之间切换,请确保给它们唯一的< action android:name="" in AndroidManifest.xml, like so:

            <activity android:name=".MainActivityKotlin">
                <intent-filter>
                    <action android:name="com.genechuang.basicfirebaseproject.KotlinActivity"/>
                    <category android:name="android.intent.category.DEFAULT" />
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity
                android:name="com.genechuang.basicfirebaseproject.MainActivityJava"
                android:label="MainActivityJava" >
                <intent-filter>
                    <action android:name="com.genechuang.basicfirebaseproject.JavaActivity" />
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
            </activity>

然后在您的 MainActivity.kt(Kotlin 文件)中,要启动用 Java 编写的 Activity,请执行以下操作:

       val intent = Intent("com.genechuang.basicfirebaseproject.JavaActivity")
        startActivity(intent)

在 MainActivityJava.java(Java 文件)中,要启动用 Kotlin 编写的 Activity,请执行以下操作:

       Intent mIntent = new Intent("com.genechuang.basicfirebaseproject.KotlinActivity");
        startActivity(mIntent);

0
投票
val intent = Intent(applicationContext, Page2::class.java)
startActivity(intent)
© www.soinside.com 2019 - 2024. All rights reserved.