我想在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)
}
}
答案 0 :(得分:118)
要在我们编写Activity
的java中启动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)
示例 -
val intent = Intent(this, NextActivity::class.java)
// To pass any data to next activity
intent.putExtra("keyIdentifier", value)
// start your next activity
startActivity(intent)
答案 1 :(得分:24)
只需使用此简单方法
即可在Activity
中开始KOTLIN
val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("key", value)
startActivity(intent)
答案 2 :(得分:22)
开始新活动
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)
}
答案 3 :(得分:7)
试试这个
'a'
答案 4 :(得分:7)
您必须提供类类型的第二个参数。你也可以像下面一样整洁一点。
startActivity(Intent(this, Page2::class.java).apply {
putExtra("extra_1", value1)
putExtra("extra_2", value2)
putExtra("extra_3", value3)
})
答案 5 :(得分:7)
通常,可以通过定义内联化泛型函数来简化参数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>()
答案 6 :(得分:3)
这是我的主要活动,我从编辑文本和设置到意图
获取用户名和密码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")
}
答案 7 :(得分:3)
这是因为您的Page2
类没有类似于Java中的static
的伴随对象,因此要使用您的类。要将您的类作为参数传递给Intent
,您必须执行类似这样的操作
val changePage = Intent(this, Page2::class.java)
答案 8 :(得分:2)
从活动到活动
val intent = Intent(this, YourActivity::class.java)
startActivity(intent)
从片段到活动
val intent = Intent(activity, YourActivity::class.java)
startActivity(intent)
答案 9 :(得分:1)
val intentAct: Intent = Intent(this@YourCurrentActivity, TagentActivity::class.java)
startActivity(intentAct)
答案 10 :(得分:0)
fun Context.launchActivity(
cls: Class<*>,
flags: Int = 0,
intentTransformer: Intent.() -> Unit = {}
) {
val intent = Intent(this, cls).apply {
addFlags(flags)
intentTransformer()
}
this.startActivity(intent)
}
答案 11 :(得分:0)
导航到另一个活动的另一种简单方法是
USE $CATALOG_XYZ;
-- catalog-sensitive sql commands:
CREATE_SCHEMA abc
...
答案 12 :(得分:0)
您可以在应用程序中使用Kotlin和Java文件。
要在两个文件之间切换,请确保在AndroidManifest.xml中为它们提供唯一的 然后在您的MainActivity.kt(科特林文件)中,启动用Java编写的活动,请执行以下操作: 在您的MainActivityJava.java(Java文件)中,要启动用Kotlin编写的Activity,请执行以下操作: <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>
val intent = Intent("com.genechuang.basicfirebaseproject.JavaActivity")
startActivity(intent)
Intent mIntent = new Intent("com.genechuang.basicfirebaseproject.KotlinActivity");
startActivity(mIntent);
答案 13 :(得分:0)
如何考虑封装?
例如:
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
}
}
答案 14 :(得分:0)
好吧,我发现以下两种方法是所有结果中最简单的:
方法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))
}
答案 15 :(得分:0)
我遇到了类似的问题,我开始用Kotlin编写应用程序,重写了我的一项活动后,我想看看是否有任何问题,问题是我不确定如何从Java发送意图。文件到kotlin文件。
在这种情况下,我在kotlin(伴侣对象)中创建了一个静态函数,该函数在使用kotlin时使用当前上下文(“ java”上下文)获取上下文(从当前活动)并返回新的意图。 class(“ :: 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);
答案 16 :(得分:0)
请记住也将您要呈现的活动添加到您的AndroidManifest.xml
中:-)这是我的问题。
答案 17 :(得分:0)
获取指向您应用程序上下文的链接
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()
}
}
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>()