Неприменимое приведение при объявлении CheckBoxPreference - PullRequest
0 голосов
/ 04 декабря 2018

После объявления 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 Ответ

0 голосов
/ 04 декабря 2018

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.

...