如何使用Androidx的PreferencesScreen

我的问题是我想在我的应用程序中添加一个PpreferencesScreen,但我不能使用它,我不知道为什么。

我实现了库。然后我想将PreferencesScreen添加到我的XML布局中,它没有建议任何建议。androidx.preference:preference:1.1.0-rc01

接下来,我将 Android 开发人员的 XML 代码复制到我的 XML 布局中并对其进行编译,但是通过启动活动,它会因错误而中断:java.lang.ClassCastException: class androidx.preference.PreferenceScreen cannot be cast to android.view.View

有人可以帮助我正确使用吗?androidx.preference.PreferenceScreen

我的布局:

<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen  xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent">
    <androidx.preference.SwitchPreference
        android:defaultValue="true"
        android:key="example_switch"
        android:summary="Turn this option on or off"
        android:title="Settings option" />
</androidx.preference.PreferenceScreen>

答案 1

现在整个答案是:

  1. 将此行添加到您的 App-Gradle:或 Kotlin 中。并同步 Gradle。创建一个名为 res 文件夹的目录。implementation 'androidx.preference:preference:1.1.1'implementation 'androidx.preference:preference-ktx:1.1.1'xml

  2. 在此目录中创建一个具有您首选名称的 XML 文件,例如 。根元素必须为 。main_preferencesandroidx.preference.PreferenceScreen

  3. 用您的设置填充 XML 文件,例如:

<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen  xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent">
    <androidx.preference.SwitchPreference
        android:defaultValue="true"
        android:key="example_switch"
        android:summary="Turn this option on or off"
        android:title="Settings option" />
</androidx.preference.PreferenceScreen>
  1. 在 com.???.??? 文件夹中的某个位置创建例如,一个名为 的 java 文件。超类(意味着)必须是 和 覆盖 。您可以复制此代码:MainSettingsFragment<Classname> extends <Superclass>PreferenceFragmentCompatonCreatePreferences
import android.os.Bundle; 
import androidx.preference.PreferenceFragmentCompat;
import com.???.???.R;

public class <YourClassname> extends PreferenceFragmentCompat {
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        // Load the preferences from an XML resource
        setPreferencesFromResource(R.xml.<yourXmlFilename>, rootKey);
    }
}
  1. 接下来,有两个选项可以在 .

美丽而最好的方法是,在创建时根据代码实现它。添加您的 a 并为其提供一个 ID,例如:SettingsActivtyFrameLayoutfl_main_settings

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:id="@+id/<!-- yourID -->">

</FrameLayout>

在您的活动代码中,在 onCreate 方法的顶部添加以下内容:

package com.???.???;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.text.Html;
import android.view.MenuItem;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.text.HtmlCompat;

import com.???.???.MainSettingsFragment;
public class SettingsActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.<SettingsActivityXML(with the FrameLayout)>);

        //If you want to insert data in your settings
        <YourSettingsFragmentClass> settingsFragment = new <YourSettingsFragmentClass>();
        settingsFragment. ...
        getSupportFragmentManager().beginTransaction().replace(R.id.<YourFrameLayout>,settingsFragment).commit();
        
        //Else
        getSupportFragmentManager().beginTransaction().replace(R.id.<YourFrameLayout>,new <YourSettingsFragmentClass>()).commit();
    }

或者,您在设置中实现ActivityXml。但我不建议这样做,因为开始活动需要几秒钟Fragment

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:baselineAligned="false">

    <fragment
        android:tag="frag"
        android:name="com.quickme.musicme.Fragments.MainSettingsFragment"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>
</LinearLayout>

这就是它的乐趣。


答案 2

java.lang.ClassCastException: class 不能强制转换为
My Layout:androidx.preference.PreferenceScreenandroid.view.View

<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen>
...
</androidx.preference.PreferenceScreen>

注意。
它不是布局。

有人可以帮助我正确使用androidx.preference.PreferenceScreen吗?

您可以在此处找到所有信息

您可以定义首选项层次结构。

谨慎:根标记必须是 ,并且 XML 资源必须放在 .<PreferenceScreen>res/xml/ directory

<PreferenceScreen
    xmlns:app="http://schemas.android.com/apk/res-auto">

    ....

</PreferenceScreen>

要从 XML 属性扩展层次结构,请创建一个 PreferredFragmentCompat,覆盖 onCreatePreferences(),并提供 XML 资源:

class MySettingsFragment : PreferenceFragmentCompat() {
    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.preferences, rootKey)
    }
}

然后将其添加到您的中,就像使用任何其他“片段”一样。FragmentActivity


推荐