簡體   English   中英

"Kotlin Android 啟動新 Activity"

[英]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)
                }

詳情

  • 安卓工作室 3.1.4
  • 科特林版本:1.2.60

步驟 1. Application()

獲取應用程序上下文的鏈接

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 :-) 這就是我的問題。

這個如何考慮封裝?

例如:


    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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM