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)
}
}
JavaでActivity
を始めるために我々はIntent(this, Page2.class)
を書きました、基本的にあなたは2番目のパラメータでContext
を最初のパラメータで定義する必要があります。ソースコードのIntent
メソッドによると -
public Intent(Context packageContext, Class<?> cls)
ご覧のとおり、2番目のパラメータにClass<?>
型を渡す必要があります。
Intent(this, Page2)
と書くことで、クラスを渡すことを指定しないで、受け入れられないclass
型を渡すことを試みています。
Kotlinの::class.Java
の代わりになる.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)
この簡単な方法でActivity
でKOTLIN
を始めることができます。
val intent = Intent(this, SecondActivity::class.Java)
intent.putExtra("key", value)
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)
}
これを試して
val intent = Intent(this, Page2::class.Java)
startActivity(intent)
あなたはクラス型の2番目の引数を与えなければなりません。以下のようにもう少しきれいにすることもできます。
startActivity(Intent(this, Page2::class.Java).apply {
putExtra("extra_1", value1)
putExtra("extra_2", value2)
putExtra("extra_3", value3)
})
インライン実体化総称関数を定義することによって、一般的にパラメーター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>()
これはあなたのクラスを使うためにあなたのPage2
クラスがJavaのstatic
に似たコンパニオンオブジェクトを持たないからです。クラスをIntent
への引数として渡すには、次のようにする必要があります。
val changePage = Intent(this, Page2::class.Java)
これは私が編集テキストからユーザー名とパスワードを取得し、意図を設定する私の主な活動です。
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);
}
}
これは私がメインアクティビティから値を受け取る必要がある私の2番目のアクティビティです。
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")
}
活動から活動へ
val intent = Intent(this, YourActivity::class.Java)
startActivity(intent)
フラグメントからアクティビティまで
val intent = Intent(activity, YourActivity::class.Java)
startActivity(intent)
val intentAct: Intent = Intent(this@YourCurrentActivity, TagentActivity::class.Java)
startActivity(intentAct)
あなたが提示したいアクティビティをあなたのAndroidManifest.xml
にも追加するのを忘れないでください:-)それが私にとっての問題でした。
あなたのアプリケーションのコンテキストへのリンクを取得する
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>()
私は同様の問題があり、私はKotlinで自分のアプリケーションを書き始めました。問題があるかどうか確認したいと思っていた活動の1つを書き直した後、問題はJavaファイルからkotlinにインテントを送る方法がわからないということでしたファイル。
この場合、私はkotlin(companionオブジェクト)で静的関数を作成しました。この関数は(現在のアクティビティから)コンテキストを取得し、kotlinクラス( "Java"コンテキスト)を使用しながら新しいインテントを返します。 :: 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);