Kotlin Android 开始新的活动

我想在 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)
}


}
199689 次浏览

这是因为您的 Page2类没有一个类似于 Java 中的 static的伴随对象,所以要使用您的类。要将类作为参数传递给 Intent,必须执行以下操作

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

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

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

正如您所看到的,我们必须在第二个参数中传递 Class<?>类型。

通过编写 Intent(this, Page2),我们从来没有指定要传递类,我们试图传递 class类型,这是不可接受的。

使用 ::class.java,这是替代 .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)
})

简单地说,你可以用这个简单的方法在 KOTLIN中启动一个 Activity,

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

试试这个

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

为了开始一项新的活动,

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

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

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

必须给出类类型的第二个参数。你也可以像下面这样把它弄得更整洁一点。

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

从活动到活动

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

从碎片到活动

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

通常可以通过定义一个内联实现的泛型函数来简化参数 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>()

细节

  • Android Studio 3.1.4
  • Kotlin 版本: 1.2.60

第一步: 申请()

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

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。添加路由器对象

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

记住把你想要展示的活动也加到你的 AndroidManifest.xml中: ——这是我的问题。

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

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

在本例中,我在 kotlin (伴侣对象)中创建了一个静态函数,该函数获取上下文(来自当前活动) ,并在使用 kotlin 类(“ : : class.java”)的同时使用当前上下文(“ 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);

我发现这两种方法是最简单的结果:

方法一:

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

sample

这样考虑封装怎么样?

例如:


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

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

要在两个文件之间切换,请确保在 AndroidManifest.xml 中为它们提供惟一的 < action android: name = “”,如下所示:

            <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 编写的活动,请执行以下操作:

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

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

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

扩展函数

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 扩展函数