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)
Gow*_*iam 27
你可以试试这个,
val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("key", value)
startActivity(intent)
Run Code Online (Sandbox Code Playgroud)
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)
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)
你必须给出类类型的第二个参数.你也可以像下面一样整洁一点.
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)
这是因为您的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)
好吧,我发现这 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)
从活动到活动
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)