代码之家  ›  专栏  ›  技术社区  ›  wbk727

声明CheckBoxPreference时无法执行强制转换

  •  1
  • wbk727  · 技术社区  · 6 年前

    CheckboxPreference 在我的应用程序设置的“我的活动”中,会出现一条警告 as 排队 val mCheckBoxPreference = findPreference("preference_a") as CheckBoxPreference 应该做些什么才能让演员们成功?

    这个演员永远不会成功

    <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 回复  |  直到 6 年前
        1
  •  1
  •   Bö macht Blau    6 年前

    TL;博士 android.support.v7.preference.CheckBoxPreference .

    CheckBoxPreference :

    • android.preference.CheckBoxPreference android.preference.Preference 作为祖先阶级
    • android.support.v7.preference.CheckBoxPreference 属于支持库并具有 android.support.v7.preference.Preference 作为祖先阶级

    Fragment 延伸自 PreferenceFragmentCompat 所以 findPreference() android.support.v7.preference.preference Preference 上课到他们的学校 不支持 相当于,当您尝试转换到应用程序时,Android Studio会显示错误消息“此转换永远不会成功” 不支持 复选框偏好 .