5

I have a preference activity but it is throwing error when I try to open it. It never launches the activity. Tried 'Bundle?' instead of 'Bundle' but it did not work.

class SettingsActivity : AppCompatPreferenceActivity() {
override fun onCreate(savedInstanceState: Bundle) {
    super.onCreate(savedInstanceState)
    supportActionBar!!.setDisplayHomeAsUpEnabled(true)
    // load settings fragment
    fragmentManager.beginTransaction()
        .replace(android.R.id.content, MainPreferenceFragment()).commit()
}

class MainPreferenceFragment : PreferenceFragment() {
    var key_video_resolution: ListPreference? = null
    var key_audio_source: ListPreference? = null
    var key_video_encoder: ListPreference? = null
    var key_video_fps: ListPreference? = null
    var key_video_bitrate: ListPreference? = null
    var key_output_format: ListPreference? = null
    var key_record_audio: SwitchPreference? = null
    var key_show_notification: SwitchPreference? = null
    override fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        addPreferencesFromResource(R.xml.pref_main)
        key_record_audio =
            findPreference(getString(R.string.key_record_audio)) as SwitchPreference
        key_audio_source =
            findPreference(getString(R.string.key_audio_source)) as ListPreference
        key_audio_source!!.onPreferenceChangeListener = audioSourceListener
        key_video_encoder =
            findPreference(getString(R.string.key_video_encoder)) as ListPreference
        key_video_encoder!!.onPreferenceChangeListener = videoEncoderListener
        key_video_resolution =
            findPreference(getString(R.string.key_video_resolution)) as ListPreference
        key_video_resolution!!.onPreferenceChangeListener = videoResolutionListener
        key_video_fps = findPreference(getString(R.string.key_video_fps)) as ListPreference
        key_video_fps!!.onPreferenceChangeListener = videoFrameRateListener
        key_video_bitrate =
            findPreference(getString(R.string.key_video_bitrate)) as ListPreference
        key_video_bitrate!!.onPreferenceChangeListener = videoBitRateListener
        key_output_format =
            findPreference(getString(R.string.key_output_format)) as ListPreference
        key_output_format!!.onPreferenceChangeListener = outputFormatListener
        key_show_notification =
            findPreference(getString(R.string.key_show_notification)) as SwitchPreference
        setPreviousSelectedAsSummary()
    }

    private fun setPreviousSelectedAsSummary() {
        val prefs =
            PreferenceManager.getDefaultSharedPreferences(activity)
        val video_resolution = prefs.getString("key_video_resolution", null)
        val audio_enabled = prefs.getBoolean("key_record_audio", true)
        val audio_source = prefs.getString("key_audio_source", null)
        val video_encoder = prefs.getString("key_video_encoder", null)
        val video_frame_rate = prefs.getString("key_video_fps", null)
        val video_bit_rate = prefs.getString("key_video_bitrate", null)
        val output_format = prefs.getString("key_output_format", null)
        val show_notificaton = prefs.getBoolean("key_show_notification", false)
        /*Record Audio Prefs*/key_record_audio!!.isChecked = audio_enabled
        /*Audio Source Prefs*/if (audio_source != null) {
            val index = key_audio_source!!.findIndexOfValue(audio_source)
            key_audio_source!!.summary = key_audio_source!!.entries[index]
        } else {
            val defaultSummary =
                PreferenceManager.getDefaultSharedPreferences(key_audio_source!!.context)
                    .getString(key_audio_source!!.key, "")
            key_audio_source!!.summary = defaultSummary
        }
        /*Video Encoder Prefs*/if (video_encoder != null) {
            val index = key_video_encoder!!.findIndexOfValue(video_encoder)
            key_video_encoder!!.summary = key_video_encoder!!.entries[index]
        } else {
            val defaultSummary =
                PreferenceManager.getDefaultSharedPreferences(key_video_encoder!!.context)
                    .getString(key_video_encoder!!.key, "")
            key_video_encoder!!.summary = defaultSummary
        }
        /*Video Resolution Prefs*/if (video_resolution != null) {
            val index = key_video_resolution!!.findIndexOfValue(video_resolution)
            key_video_resolution!!.summary = key_video_resolution!!.entries[index]
        } else {
            val defaultSummary =
                PreferenceManager.getDefaultSharedPreferences(key_video_resolution!!.context)
                    .getString(key_video_resolution!!.key, "")
            key_video_resolution!!.summary = defaultSummary
        }
        /*Video Frame Rate Prefs*/if (video_frame_rate != null) {
            val index = key_video_fps!!.findIndexOfValue(video_frame_rate)
            key_video_fps!!.summary = key_video_fps!!.entries[index]
        } else {
            val defaultSummary =
                PreferenceManager.getDefaultSharedPreferences(key_video_fps!!.context)
                    .getString(key_video_fps!!.key, "")
            key_video_fps!!.summary = defaultSummary
        }
        /*Video Bit Rate Prefs*/if (video_bit_rate != null) {
            val index = key_video_bitrate!!.findIndexOfValue(video_bit_rate)
            key_video_bitrate!!.summary = key_video_bitrate!!.entries[index]
        } else {
            val defaultSummary =
                PreferenceManager.getDefaultSharedPreferences(key_video_bitrate!!.context)
                    .getString(key_video_bitrate!!.key, "")
            key_video_bitrate!!.summary = defaultSummary
        }
        /*Output Format Prefs*/if (output_format != null) {
            val index = key_output_format!!.findIndexOfValue(output_format)
            key_output_format!!.summary = key_output_format!!.entries[index]
        } else {
            val defaultSummary =
                PreferenceManager.getDefaultSharedPreferences(key_output_format!!.context)
                    .getString(key_output_format!!.key, "")
            key_output_format!!.summary = defaultSummary
        }
        /*Notification Prefs*/key_show_notification!!.isChecked = show_notificaton
    }

    /*Audio Source*/
    private val audioSourceListener =
        OnPreferenceChangeListener { preference, newValue ->
            val stringValue = newValue.toString()
            val listPreference =
                findPreference(getString(R.string.key_audio_source)) as ListPreference
            val index = listPreference.findIndexOfValue(stringValue)
            listPreference.summary = listPreference.entries[index]
            true
        }
    /*Video Encoder*/
    private val videoEncoderListener =
        OnPreferenceChangeListener { preference, newValue ->
            val stringValue = newValue.toString()
            val listPreference =
                findPreference(getString(R.string.key_video_encoder)) as ListPreference
            val index = listPreference.findIndexOfValue(stringValue)
            listPreference.summary = listPreference.entries[index]
            listPreference.value = stringValue
            true
        }
    /*Video Resolution*/
    private val videoResolutionListener =
        OnPreferenceChangeListener { preference, newValue ->
            val stringValue = newValue.toString()
            val listPreference =
                findPreference(getString(R.string.key_video_resolution)) as ListPreference
            val index = listPreference.findIndexOfValue(stringValue)
            listPreference.summary = listPreference.entries[index]
            listPreference.value = stringValue
            true
        }
    /*Video Frame Rate*/
    private val videoFrameRateListener =
        OnPreferenceChangeListener { preference, newValue ->
            val stringValue = newValue.toString()
            val listPreference =
                findPreference(getString(R.string.key_video_fps)) as ListPreference
            val index = listPreference.findIndexOfValue(stringValue)
            listPreference.summary = listPreference.entries[index]
            listPreference.value = stringValue
            true
        }
    /*Video Bit Rate*/
    private val videoBitRateListener =
        OnPreferenceChangeListener { preference, newValue ->
            val stringValue = newValue.toString()
            val listPreference =
                findPreference(getString(R.string.key_video_bitrate)) as ListPreference
            val index = listPreference.findIndexOfValue(stringValue)
            listPreference.summary = listPreference.entries[index]
            listPreference.value = stringValue
            true
        }
    /*outputFormat*/
    private val outputFormatListener =
        OnPreferenceChangeListener { preference, newValue ->
            val stringValue = newValue.toString()
            val listPreference =
                findPreference(getString(R.string.key_output_format)) as ListPreference
            val index = listPreference.findIndexOfValue(stringValue)
            listPreference.summary = listPreference.entries[index]
            listPreference.value = stringValue
            true
        }
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    if (item.itemId == android.R.id.home) {
        onBackPressed()
    }
    return super.onOptionsItemSelected(item)
}

companion object {
    private val TAG = SettingsActivity::class.java.simpleName
}
}

and the exception I am getting is:

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter savedInstanceState at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) Caused by: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter savedInstanceState at com.evonative.screenrecorder.SettingsActivity.onCreate(Unknown Source:2) at android.app.Activity.performCreate(Activity.java:7136) at android.app.Activity.performCreate(Activity.java:7127) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)  at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)  at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)  at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)  at android.os.Handler.dispatchMessage(Handler.java:106)  at android.os.Looper.loop(Looper.java:193)  at android.app.ActivityThread.main(ActivityThread.java:6669)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

Any help would be highly appreciated. Thanks

** AppCompatPreferenceActivity**

abstract class AppCompatPreferenceActivity : PreferenceActivity() {
private var mDelegate: AppCompatDelegate? = null
override fun onCreate(savedInstanceState: Bundle) {
    delegate!!.installViewFactory()
    delegate!!.onCreate(savedInstanceState)
    super.onCreate(savedInstanceState)
}

override fun onPostCreate(savedInstanceState: Bundle) {
    super.onPostCreate(savedInstanceState)
    delegate!!.onPostCreate(savedInstanceState)
}

val supportActionBar: ActionBar?
    get() = delegate!!.supportActionBar

fun setSupportActionBar(toolbar: Toolbar?) {
    delegate!!.setSupportActionBar(toolbar)
}

override fun getMenuInflater(): MenuInflater {
    return delegate!!.menuInflater
}

override fun setContentView(@LayoutRes layoutResID: Int) {
    delegate!!.setContentView(layoutResID)
}

override fun setContentView(view: View) {
    delegate!!.setContentView(view)
}

override fun setContentView(
    view: View,
    params: ViewGroup.LayoutParams
) {
    delegate!!.setContentView(view, params)
}

override fun addContentView(
    view: View,
    params: ViewGroup.LayoutParams
) {
    delegate!!.addContentView(view, params)
}

override fun onPostResume() {
    super.onPostResume()
    delegate!!.onPostResume()
}

override fun onTitleChanged(title: CharSequence, color: Int) {
    super.onTitleChanged(title, color)
    delegate!!.setTitle(title)
}

override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)
    delegate!!.onConfigurationChanged(newConfig)
}

override fun onStop() {
    super.onStop()
    delegate!!.onStop()
}

override fun onDestroy() {
    super.onDestroy()
    delegate!!.onDestroy()
}

override fun invalidateOptionsMenu() {
    delegate!!.invalidateOptionsMenu()
}

private val delegate: AppCompatDelegate?
    private get() {
        if (mDelegate == null) {
            mDelegate = AppCompatDelegate.create(this, null)
        }
        return mDelegate
    }
}
10
  • 1
    I tried the code, Bundle? on SettingActivity does the work for me, maybe you're doing something in AppCompatPreferenceActivity?. Can you add that code as well. Commented Apr 14, 2020 at 6:53
  • added the code for AppCompatPreferenceActivity. Commented Apr 14, 2020 at 6:58
  • You have defined activity in your manifest? Commented Apr 14, 2020 at 7:00
  • 1
    The savedInstanceState will always be null the first time an Activity is started, use Bundle? always. Checkout: tanzu.vmware.com/content/blog/… Commented Apr 14, 2020 at 7:00
  • @MohammadMoeinGolchin yes Commented Apr 14, 2020 at 7:03

1 Answer 1

13

The issue fixed the error was coming from the parent and child classes. I have made the Bundle to nullable and changed it to Bundle? everywhere in the parent and child classes like:

In SettingsActicity.kt:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    supportActionBar!!.setDisplayHomeAsUpEnabled(true)
    // load settings fragment
    fragmentManager.beginTransaction()
        .replace(android.R.id.content, MainPreferenceFragment()).commit()
}

and then MainPreferenceFragment inside the SettingsActivity class. And Also made this change in onCreate and onPostCreate methods of AppCompatPreferenceActivity.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.