Android 开关首选项布局在打开前不正确

Android 开关首选项布局在打开前不正确,android,android-fragments,kotlin,android-support-library,android-preferences,Android,Android Fragments,Kotlin,Android Support Library,Android Preferences,我正在使用Android支持库中的PreferenceFragmentCompat,我遇到了一个奇怪的问题。加载片段时,我正在使用的SwitchPreference元素上的开关显示在文本旁边,这是错误的位置。如果我点击一个开关或滚动,使开关不在视野内,它会自行修复。注:这发生在API 25上,而不是API 18上 装载时: 轻触或滚动后: 你有什么想法吗?感谢您的帮助 以下是我所做的: 切换到SwitchPreferenceCompat 更改(并最终删除)style.xml中的自定义主题 创

我正在使用Android支持库中的
PreferenceFragmentCompat
,我遇到了一个奇怪的问题。加载片段时,我正在使用的
SwitchPreference
元素上的开关显示在文本旁边,这是错误的位置。如果我点击一个开关或滚动,使开关不在视野内,它会自行修复。注:这发生在API 25上,而不是API 18上

装载时:

轻触或滚动后:

你有什么想法吗?感谢您的帮助

以下是我所做的:

  • 切换到
    SwitchPreferenceCompat
  • 更改(并最终删除)style.xml中的自定义主题
  • 创建了一组较小的开关,不会填满屏幕。有趣的是,如果屏幕上没有填充首选项,那么布局看起来很棒
  • 在片段的视图上调用
    invalidate()
    ,强制重画(希望它能像滚动一样修复)
  • 在文本中添加了一堆空格,使其成为不起作用的全宽(尽管实际上文本像一堆句点……确实起作用了lol)
  • 创建首选项的代码(以Kotlin为单位):

    class PreferencesFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedPreferenceChangeListener {
    
        override fun onCreatePreferences(bundle: Bundle?, s: String?) {
            val deviceCategory = PreferenceCategory(activity)
            deviceCategory.title = activity.getString(R.string.preferences_Device_Defaults)
            preferenceScreen.addPreference(deviceCategory)
    
            val clockPref = SwitchPreference(activity)
            clockPref.title = activity.getString(R.string.preferences_Automatic_clock_synchronization)
            clockPref.isChecked = true
            clockPref.key = "clockSync"
            deviceCategory.addPreference(clockPref)
    
            // Add more preferences....
    
            val unitCategory = PreferenceCategory(activity)
            unitCategory.title = activity.getString(R.string.preferences_Unit_Defaults)
            preferenceScreen.addPreference(unitCategory)
    
            val runCellTestOnConnect = SwitchPreference(activity)
            runCellTestOnConnect.title = activity.getString(R.string.preferences_Cell_network_check)
            runCellTestOnConnect.isChecked = true
            runCellTestOnConnect.key = "runCellTestOnConnect"
            unitCategory(runCellTestOnConnect)
    
            // Add more preferences....
        }
    }
    

    我在科特林开发时遇到了完全相同的问题。目前我有一个临时解决办法:在所有其他首选项之前创建一个空首选项,并在其摘要中填充一个长的不可见字符串

    例如,假设我正在使用一个XML文件来构造首选项:

    <?xml version="1.0" encoding="utf-8"?>
    <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
        <Preference
            android:key="pref_static_field_key"
            android:persistent="false"
            android:selectable="false"
            android:summary="@string/spaces" />
        <!-- Other Preferences -->
    </PreferenceScreen>
    
    
    
    然后您会注意到,以下SwitchPreference元素的宽度由该空首选项的宽度决定。如果“@string/spaces”足够长(例如多行或至少与整个屏幕一样长),则可以获得正确的宽度