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

创建设置活动时出现布尔参数问题

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

    在为设置页面创建活动后,我注意到, mCurrentValue !== value if (mCurrentValue !== value) 返回警告:

    布尔型参数的标识相等?由于隐式装箱,布尔值可能不稳定

    我试图通过添加一个 ? Boolean 在里面 override fun onXchange(value:Boolean) {

    关于如何解决这个问题有什么想法吗?

    活动课

    import android.content.Intent
    import android.graphics.Color
    import android.graphics.drawable.ColorDrawable
    import android.os.Bundle
    import android.preference.PreferenceManager
    import android.support.v7.app.AppCompatActivity
    import android.view.MenuItem
    
    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))
                myActionBar.setDisplayHomeAsUpEnabled(true)
                myActionBar.setDisplayShowHomeEnabled(true)
                myActionBar.setHomeAsUpIndicator(resources.getDrawable(R.drawable.ic_arrow_back_white, null))
            }
        }
    
        override fun onXchange(value:Boolean?) {
            if (mCurrentValue !== value) {
                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)
            }
        }
    }
    

    片段类

    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
        }
    
        private var mPreferenceXchangeListener: PreferenceXchangeListener? = null
    
        interface PreferenceXchangeListener {
            fun onXchange(value:Boolean)
        }
    
        override fun onAttach(context: Context) {
            super.onAttach(context)
    
            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
    
                mPreferenceXchangeListener!!.onXchange(newValue)
                return true
            }
    
            return false
        }
    
        companion object {
            private val TAG = MySettingsFragment::class.java.simpleName
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Kevin Coppock    6 年前

    BooleanProvider.java

    class BooleanProvider {
        @NonNull Boolean wrapMyBoolean(boolean state) {
            return new Boolean(state);
        }
    }
    

    class BooleanProviderTest {
        @Test fun `it returns a true value when true is provided`() {
            assertSame(BooleanProvider().wrapMyBoolean(true), true)
        }
    }
    

    这个测试实际上会失败,因为 Boolean 它们不一样。在Java代码中,我们初始化了 布尔值 (而不是静态定义的 Boolean.TRUE Boolean.FALSE 将基本体自动装箱到 java.lang.Boolean )。因此,为了避免潜在的意外结果,建议您不要通过引用来比较这些类型。

    != 而不是 !== . 这将执行标识相等测试而不是引用相等测试,并将适当地处理任意一侧的空值。不管怎样,99%的时间你都想要这样。

    mCurrentValue 如果不需要以特定方式处理null值,则将其作为非null类型,并为其指定一个默认值。只需声明如下:

    private var mCurrentValue: Boolean = false // false is the default here