ui 活动 MainActivity 没有零参数构造函数

ui activity MainActivity has no zero argument constructor

提问人:Salih AbdAlrahman 提问时间:10/3/2021 更新时间:10/3/2021 访问量:778

问:

我是一个非常中级的程序员(仍在学习),我只知道 Kotlin 的基础知识,我不知道 Android Studio 的大部分概念。因此,请以最简单的方式解释

我尝试在我的应用程序中添加 ADOMB 广告,但经过三周的尝试,我只得到错误

区块报价

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.sudanese.stickers.kotlinized.debug, PID: 6332
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.sudanese.stickers.kotlinized.debug/com.costafot.stickers.ui.activity.MainActivity}: java.lang.InstantiationException: java.lang.Class<com.costafot.stickers.ui.activity.MainActivity> has no zero argument constructor
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3365)
    

主要活动

    package com.costafot.stickers.ui.activity

import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import androidx.navigation.NavController
import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.navigateUp
import androidx.navigation.ui.onNavDestinationSelected
import androidx.navigation.ui.setupActionBarWithNavController
import com.sudanese.stickers.BuildConfig
import com.sudanese.stickers.R
import com.costafot.stickers.extensions.logDebug
import com.costafot.stickers.extensions.toast
import com.costafot.stickers.toaster.Message
import com.costafot.stickers.toaster.Resource
import com.costafot.stickers.toaster.ToastMessage
import com.costafot.stickers.ui.activity.viewmodel.MainViewModel
import com.costafot.stickers.ui.activity.viewmodel.MainViewModelFactory
import com.costafot.stickers.ui.base.BaseActivity
import com.google.android.gms.ads.AdRequest
import kotlinx.android.synthetic.main.activity_main.*
import javax.inject.Inject
import com.google.android.gms.ads.MobileAds

class MainActivity(override var mAdView: Any, override val AddRequest: Any) : BaseActivity() {

    @Inject
    internal lateinit var factoryMainViewModel: MainViewModelFactory

    private val mainViewModel: MainViewModel by lazy {
        ViewModelProviders.of(this, factoryMainViewModel).get(MainViewModel::class.java)
    }
    private lateinit var appBarConfiguration: AppBarConfiguration

    @SuppressLint("MissingPermission")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        MobileAds.initialize(this)

        val adRequest = AdRequest.Builder().build()
        adView.loadAd(adRequest)

        setupToolbar()

        mainViewModel.toastSingleLiveEvent.observe(this, Observer(this@MainActivity::toast))
        mainViewModel.launchIntentSingleLiveEvent.observe(this, Observer(this@MainActivity::handleLaunchIntentCommand))
    }

  
private fun handleLaunchIntentCommand(launchIntentCommand: LaunchIntentCommand) {
    when (launchIntentCommand) {
        is LaunchIntentCommand.Chooser -> {
            launchIntentToAddPackToChooser(launchIntentCommand.intent)
        }
        is LaunchIntentCommand.Specific -> {
            launchIntentToAddPackToSpecificPackage(launchIntentCommand.intent)
        }
    }
}

// Handle cases either of WhatsApp are set as default app to handle this intent. We still want users to see both options.
private fun launchIntentToAddPackToChooser(intent: Intent) {
    try {
        startActivityForResult(Intent.createChooser(intent, getString(R.string.add_to_whatsapp)), REQUEST_CODE_ADD_PACK)
    } catch (e: Throwable) {
        toast(ToastMessage.Error(resource = Resource(R.string.add_pack_fail_prompt_update_whatsapp)))
    }
}

private fun launchIntentToAddPackToSpecificPackage(intent: Intent) {
    try {
        startActivityForResult(intent, REQUEST_CODE_ADD_PACK)
    } catch (e: Throwable) {
        toast(ToastMessage.Info(resource = Resource(R.string.add_pack_fail_prompt_update_whatsapp)))
    }
}

override fun onResume() {
    super.onResume()
    mainViewModel.loadStickers()
}

override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) {
    super.onActivityResult(requestCode, resultCode, intent)
    if (requestCode == REQUEST_CODE_ADD_PACK) {
        if (resultCode == Activity.RESULT_CANCELED) {
            if (intent != null) {
                val bundle = intent.extras
                if (bundle != null && bundle.containsKey(RESULT_STRING_EXTRA)) {
                    val validationError: String? = bundle.getString(RESULT_STRING_EXTRA)
                    validationError?.let {
                        if (BuildConfig.DEBUG) {
                            toast(ToastMessage.Error(message = Message(it)))
                        }
                        logDebug { "Validation failed. Error: $validationError" }
                    }
                } else {
                    toast(ToastMessage.Error(message = Message("Cancelled but no validation error given.")))
                }
            } else {
                toast(ToastMessage.Info(resource = Resource(R.string.add_pack_fail_prompt_update_whatsapp)))
            }
        }
    }
}

private fun setupToolbar() {
    setSupportActionBar(toolbar)
    supportActionBar?.setDisplayShowTitleEnabled(false)
    val navController = findNavController(R.id.nav_host_fragment)
    appBarConfiguration = AppBarConfiguration(navController.graph)
    setupActionBarWithNavController(navController, appBarConfiguration)

    setupDestinationListener(navController)
}

private fun setupDestinationListener(navController: NavController) {
    navController.addOnDestinationChangedListener { _, destination, _ ->
        when (destination.id) {
            R.id.hostFragment -> logDebug { "hostFragment showing!" }
            R.id.anotherFragment -> logDebug { "anotherFragment showing!" }
        }
    }
}

override fun onSupportNavigateUp(): Boolean {
    val navController = findNavController(R.id.nav_host_fragment)
    return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    val navController = findNavController(R.id.nav_host_fragment)
    return item.onNavDestinationSelected(navController)
}

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.toolbar_menu, menu)
    return true
}

companion object {
    const val REQUEST_CODE_ADD_PACK = 200
    const val RESULT_STRING_EXTRA = "validation_error"
}

}

安卓 Android-Studio Kotlin

评论

1赞 CommonsWare 10/3/2021
替换为 .class MainActivity(override var mAdView: Any, override val AddRequest: Any)class MainActivity()
0赞 Salih AbdAlrahman 10/3/2021
它的 make 错误(类“MainActivity”不是抽象的,并且没有实现抽象基类成员 public abstract val AddRequest:com.costafot.stickers.ui.base.BaseActivity 中定义的任何定义)
0赞 CommonsWare 10/3/2021
然后摆脱这些东西,我想。BaseActivity
0赞 CommonsWare 10/3/2021
或者,仍然有一个零参数构造函数 () 并将值传递到对构造函数的调用中: ,您将在其中替换 和 替换为对您的方案有意义的任何值。MainActivityMainActivity()BaseActivityclass MainActivity() : BaseActivity(something, somethingElse)somethingsomethingElse
0赞 Salih AbdAlrahman 10/3/2021
我真的不明白

答: 暂无答案