android - 如何在我只需要更改 Activity 而不在 Intent 中添加任何内容的情况下抽象更改 Activity 逻辑?

标签 android android-activity kotlin

我有一个简单的 Activity ,当它创建时,它会做一些检查,如果用户没有登录,它可能会切换到另一个 Activity 。

如果我这样做,它会起作用:

class HomeActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_home)

        if (userPreference?.memberRegistered == false) {
            val intent = Intent(this, AuthActivity::class.java)
            startActivity(intent)
        }
    }
}

但是如果我把它抽象成另一种方法,它就不行了。

class HomeActivity : SalectActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_home)

        if (userPreference?.memberRegistered == false) {
            goToActivity(AuthActivity::class.java)
        }
    }

    fun <T: Any> goToActivity(activity: Class<T>) {
        val intent = Intent(this, activity::class.java)
        startActivity(intent)
    }
}

错误是:

java.lang.RuntimeException: Unable to start activity ComponentInfo{nz.salect.handset/nz.salect.handset.HomeActivity}:

android.content.ActivityNotFoundException: Unable to find explicit activity class {nz.salect.handset/java.lang.Class}; have you declared this activity in your AndroidManifest.xml?
.......

Caused by: android.content.ActivityNotFoundException: Unable to find explicit activity class {nz.salect.handset/java.lang.Class}; have you declared this activity in your AndroidManifest.xml?
.......

错误发生在 startActivity() 调用处。

这是Manifest,当然AuthActivity是有的,不然正常的方式不行。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="nz.salect.handset">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".HomeActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".AuthActivity" />
    </application>

</manifest>

这里发生了什么?

如何解决这个问题,我错过了什么?

最佳答案

Caused by: android.content.ActivityNotFoundException: Unable to find explicit activity class >

你得到上面的异常是因为你在 list 文件中没有任何 Activity activity::class.java 这就是你得到 ActivityNotFoundException 的原因/p>

当你使用 val intent = Intent(this, activity::class.java) 意味着你 intent 到另一个名为“activity”的 Activity 而不是你的 AuthActivity

根据 my above comment

使用这个

fun <T: Any> goToActivity(activity: Class<T>) {
        val intent = Intent(this, activity)
        startActivity(intent)
}

代替这个

fun <T: Any> goToActivity(activity: Class<T>) {
        val intent = Intent(this, activity::class.java)
        startActivity(intent)
    }

关于android - 如何在我只需要更改 Activity 而不在 Intent 中添加任何内容的情况下抽象更改 Activity 逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49663877/

相关文章:

android - RecyclerView.OnItemClickListener 与在 RecyclerView 的查看器中实现 onClickListener?

java - 是什么导致了 API 级别的变化?

android - 如何创建登录屏幕

android - 有意向地在 Activity 之间传递数据

java - 完成 Activity 后修剪回历史

android - Kotlin:如何摆脱功能过载样板?

java - 我们如何使用 Linear 布局来代替 ListView

Android:动态添加单元格到GridView?

java - 如何为同一布局中的多个按钮设置全局点击监听器?

android - kotlin中的lazy和lazyFast有什么区别?