Неприменимое приведение при объявлении CheckBoxPreference

После объявления CheckboxPreference в моей активности для настроек моего приложения появляется предупреждение для as в соответствии 'val mCheckBoxPreference = findPreference("preference_a") as CheckBoxPreference". Что нужно сделать, чтобы актерский состав удался?

Этот акт никогда не может быть успешным

app_preferences.xml

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <CheckBoxPreference
        android:key="preference_a"
        android:defaultValue="false"
        android:title="Preference A"/>

</PreferenceScreen>

класс фрагмента

import android.content.Context
import android.os.Bundle
import android.preference.CheckBoxPreference
import android.preference.Preference
import android.support.v7.preference.PreferenceFragmentCompat
import android.util.Log

class MySettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferenceChangeListener {
    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        addPreferencesFromResource(R.xml.app_preferences)

        val mCheckBoxPreference = findPreference("preference_a") as CheckBoxPreference
        mCheckBoxPreference.onPreferenceChangeListener = this
    }

    // declaring PreferenceXchangeListener
    private var mPreferenceXchangeListener: PreferenceXchangeListener? = null

    // declaring PreferenceXchangeListener in order to communicate with Activities
    interface PreferenceXchangeListener {
        fun onXchange(value:Boolean)
    }

    override fun onAttach(context: Context) {
        super.onAttach(context)
        // on attach - assign parent Activity as PreferenceXchangeListener
        try
        {
            mPreferenceXchangeListener = context as MySettingsFragment.PreferenceXchangeListener
        }
        catch (e:ClassCastException) {
            Log.e(TAG, "onAttach::::: PreferenceXchangeListener must be set in parent Activity")
        }
    }

    override fun onPreferenceChange(preference: Preference, newValue:Any):Boolean {
        val preferenceKey = preference.key

        if (preferenceKey == "preference_a")
        {
            (preference as CheckBoxPreference).isChecked = newValue as Boolean
            // executing parent Activity's callback with the new value
            mPreferenceXchangeListener!!.onXchange(newValue)
            return true
        }
        return false
    }

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

класс деятельности

class MySettingsActivity : AppCompatActivity(), MySettingsFragment.PreferenceXchangeListener {
    private var mCurrentValue: Boolean? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        val mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
        mCurrentValue = mSharedPreferences.getBoolean("preference_a", false)
        if (mCurrentValue as Boolean)
        {
            setTheme(R.style.MyDarkAppCompatTheme)
        }
        else
        {
            setTheme(R.style.MyLightAppCompatTheme)
        }
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_mysettings)

        val settingsFragment = MySettingsFragment()
        supportFragmentManager
                .beginTransaction()
                .replace(R.id.settings_container, settingsFragment)
                .commit()

        val myActionBar = actionBar

        if (myActionBar != null)
        {
            myActionBar.setTitle(R.string.settings)                
            myActionBar.setBackgroundDrawable(ColorDrawable(Color.BLACK))
        }
    }

    override fun onXchange(value:Boolean) {
        if (value !== mCurrentValue)
        {
            mCurrentValue = value
            recreate()
        }
    }


    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when (item.itemId) {
            android.R.id.home -> {
                val intent = parentActivityIntent
                intent?.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
                onBackPressed()
                return true
            }

            else ->
                return super.onOptionsItemSelected(item)
        }
    }

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

1 ответ

Решение

TL;DR Вы должны изменить импорт на android.support.v7.preference.CheckBoxPreference,

Есть две версии CheckBoxPreference:

  • android.preference.CheckBoxPreference, который был добавлен на уровне API 1 и имеет android.preference.Preference как класс предков
  • android.support.v7.preference.CheckBoxPreference которая принадлежит библиотеке поддержки и имеет android.support.v7.preference.Preference как класс предков

Ваш Fragment простирается от PreferenceFragmentCompat, так findPreference() вернет android.support.v7.preference.Preference, Так как вы не можете разыграть поддержку Preference Android Studio отображает классы, не поддерживающие эквивалент, при попытке приведения к не поддерживающему выводить сообщение об ошибке "Это приведение никогда не может быть успешным"CheckBoxPreference,

Другие вопросы по тегам