为什么API28个平台资源不可用?

Why are API 28 platform resources not available?

TL;DR:

这一行编译:

int resid = android.R.layout.preference_category;

但是这一行没有:

int resid = android.R.layout.preference;

错误是"cannot find symbol variable preference"。但是这两个资源在Sdk\platforms\android-28\data\res\layout目录下明明是可用的!

为什么会这样?

背景

我可以(在 IDE 中)导航到 preference_category 资源,果然,preference.xml 布局就在它旁边,还有大约一千种其他布局同样,也不会编译。

我的build.gradle(摘录):

compileSdkVersion 28

defaultConfig {
    minSdkVersion 18
    targetSdkVersion 26
}

我最近将我的应用程序切换到了 AndroidX。大多数情况下,一切都进行得很顺利,只是我注意到我的偏好有了新的视觉风格。我不在乎,除了我有 "subclassed" preference.xml 通过复制原始 Android 布局,进行微不足道的更改,然后在我的 prefs.xml 中指定该布局,例如:

...
<androidx.preference.CheckBoxPreference
    android:key="@string/pref_audio"
    android:title="Audio"
    android:defaultValue="false"
    android:layout="@layout/my_custom_preference"
    />
...

我以这种方式处理的首选项看起来仍然像以前一样——在我切换到 AndroidX 之前它们看起来的样子。但是所有其他偏好现在看起来都大不相同了。

我回到API28级文件夹,查看Android原来的preference.xml的内容,看看有没有变(因为我原来copied/subclassed 它)。它没有!然而,偏好的样式已经改变。

为了排除故障,我尝试验证 android.R.layout.preference 是否确实指向我正在查看的资源,这导致我出现了上述编译错误。

只是不要使用框架的首选项(包括资源 android.R.layout.preference_category),但 androidx.preference. This also features a new one PreferenceManager, which should be used instead. Mixing up android.preference with androidx.preference may lead to unexpected results. Once posted one custom 可能是一个合适的起点。