我如何使用Android的DropDownPreference?

我正在尝试使用DropDownPreference构建一个首选项屏幕。 最初我在我的gradle文件中使用了下面的代码compile 'com.android.support:preference-v14:25.3.1'但是当我注意到DropDownPreference时切换到compile 'com.android.support:preference-v7:25.3.1'包含在v7中,而不是v14(我认为v14也可能包括v7中的所有内容,但我猜不是?)。 我的XML看起来像这样:

 <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:title="@string/pref_title" android:layout_height="match_parent" android:layout_width="match_parent"> <PreferenceCategory android:key="pref_video" android:title="@string/pref_video_title"> <android.support.v7.preference.DropDownPreference android:key="pref_video_quality" android:title="@string/pref_video_quality" android:summary="@string/pref_summary_video_quality" android:entries="@array/pref_entries_video_quality" android:entryValues="@array/pref_entries_video_quality" /> </PreferenceCategory> </PreferenceScreen> 

我也试过DropDownPreference作为标签。 似乎没有任何工作。 当我尝试去应用程序中的我的首选项屏幕时,我总是得到一个Error inflating class DropDownPreference错误。

任何想法如何使用这个DropDownPreference? 谢谢!

编辑:添加错误消息:

  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.app.int_a.giantbombforandroid/com.app.int_a.giantbombforandroid.main.SettingsActivity}: java.lang.ClassCastException: android.support.v7.preference.DropDownPreference cannot be cast to android.preference.Preference 

编辑:AndroidManifest.xml中的SettingsActivity声明

 <activity android:name=".main.SettingsActivity" android:configChanges="orientation|screenSize" android:theme="@style/PreferenceThemeOverlay.v14.Material"> </activity> 

从我的评论跟进。 代码在Kotlin btw 🙂

styles.xml

 <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> ... <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item> </style> 

activity_settings.xml

 <LinearLayout android:orientation="vertical"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" /> <FrameLayout android:id="@+id/frame"/> </LinearLayout> 

prefs.xml正是你在你的问题

Settings.kt

 class SettingsActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_settings) setupActionBar() if (savedInstanceState == null) supportFragmentManager .beginTransaction() .add(R.id.frame, SettingsFragment.newInstance()) .commit() } private fun setupActionBar() { setSupportActionBar(toolbar) supportActionBar?.setDisplayHomeAsUpEnabled(true) } class SettingsFragment : PreferenceFragmentCompat() { override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) val actionBar = (activity as AppCompatActivity).supportActionBar actionBar?.title = preferenceScreen.title } override fun onCreatePreferences(bundle: Bundle?, rootKey: String?) { // Using this method instead of addPreferencesFromXml so we can specify the root preference screen // This way, navigating to a new screen is as simple as calling SettingsFragment.newInstance("new_root") setPreferencesFromResource(R.xml.prefs, rootKey) } companion object { fun newInstance(rootKey: String = "root") = SettingsFragment().apply { // When you pass a string argument with key ARG_PREFERENCE_ROOT, // PreferenceFragmentCompat picks it up and supplies it as an argument to onCreatePreferences arguments = Bundle().apply { putString(ARG_PREFERENCE_ROOT, rootKey) } } } } } 

这是最终的结果:

在这里输入图像描述

Interesting Posts