[英]Kotlin Android start new Activity
我想在 Android 上開始另一個活動,但出現此錯誤:
請指定構造函數調用; 分類器“Page2”沒有伴隨對象
在實例化
Intent<\/code>類之后。
我應該怎么做才能糾正錯誤? 我的代碼:
要在 Java 中啟動Activity
,我們編寫了Intent(this, Page2.class)
,基本上您必須在第一個參數中定義Context
,在第二個參數中定義目標類。 根據源代碼中的Intent
方法 -
public Intent(Context packageContext, Class<?> cls)
如您所見,我們必須在第二個參數中傳遞Class<?>
類型。
通過編寫Intent(this, Page2)
我們從不指定我們要傳遞類,我們試圖傳遞不可接受的class
類型。
使用::class.java
替代::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)
只需使用這種簡單的方法,您就可以在KOTLIN
啟動一個Activity
,
val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("key", value)
startActivity(intent)
要開始一個新的 Activity ,
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)
}
您通常可以通過定義內聯具體化泛型函數來簡化參數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>()
你必須給出類類型的第二個參數。 你也可以像下面一樣把它弄得更整潔一點。
startActivity(Intent(this, Page2::class.java).apply {
putExtra("extra_1", value1)
putExtra("extra_2", value2)
putExtra("extra_3", value3)
})
試試這個
val intent = Intent(this, Page2::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")
}
好吧,我發現這 2 種方法是所有結果中最簡單的:
方式#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))
}
這是因為您的Page2
類沒有類似於 Java 中的static
的伴隨對象,因此可以使用您的類。 要將您的類作為參數傳遞給Intent
,您必須執行以下操作
val changePage = Intent(this, Page2::class.java)
從活動到活動
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)
我有一個類似的問題,我開始在 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);
導航到另一個活動的另一種簡單方法是
Intent(this, CodeActivity::class.java).apply {
startActivity(this)
}
獲取應用程序上下文的鏈接
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>()
請記住將您想要呈現的活動也添加到您的AndroidManifest.xml
:-) 這就是我的問題。
這個如何考慮封裝?
例如:
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 編寫的活動,請執行以下操作:
val intent = Intent("com.genechuang.basicfirebaseproject.JavaActivity")
startActivity(intent)
在 MainActivityJava.java(Java 文件)中,要啟動用 Kotlin 編寫的 Activity,請執行以下操作:
Intent mIntent = new Intent("com.genechuang.basicfirebaseproject.KotlinActivity");
startActivity(mIntent);
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)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.