【Android】PreferenceFragment

调用PreferenceFragment类出错,用了我三天时间才搞定,查官方文档,看百度

最后在这位大佬的帖子帮助下终于搞定了。

https://blog.csdn.net/cqx13763055264/article/details/78498419#commentBox

PreferenceActivity创建和使用比较复杂,Android官方现在不建议使用了,使用Preference和fragment的结合更加便利地写出一个settings页面,下面来介绍PreferenceScreen和fragment结合方法

当然看个官方文档我也受益匪浅

1.导包问题

由于很多都被弃用了,我先找到了PreferenceFragmentCompat

通过选择Guide这个可以进入查看详细的sample

左侧这边可以看一下特性

https://developer.android.com/reference/android/support/v7/preference/PreferenceFragmentCompat.html

这里会指明添加gradel依赖项

在gradel.builder中加入支持库

//implementation 'com.android.support:preference-v7:28.0.0-alpha1'

下面正式开始

1:文件的结构是:一个MainActivity,一个对应layout布局,一个可引入的XML碎片布局

2.具体内容

2.1 【settingsfragment.xml 】  一个布局碎片 使用<PreferenceScreen>标签作为最外层包裹,写好不用管了供以后调用

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <Preference
            android:key="clear_cache"
            android:title="清除缓存"/>
    <SwitchPreference
            android:key="push"
            android:title="推送通知"/>
    <SwitchPreference
            android:key="no_wifi"
            android:title="非wifi下加载图片"/>
    <Preference
            android:key="about"
            android:title="关于"/>
</PreferenceScreen>

2.21使用刚开始创建一个的MainActivity

package com.ywjh.settingsbyprenference;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;


import android.os.Bundle;
import android.preference.PreferenceFragment;

/*主类中打开layout布局,其中layout会以class方式调用下面的类并打开其引用的xml块*/
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
/*在主类添加一个静态类继承Preferencement  实现oncreate和 addPreferencesFromResource调用xml布局*/
    public static class SettingsFragment extends PreferenceFragment {
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.settingsfragment);
        }


    }
}

2.21更新 由于Preference被弃用了 使用androidx包下的方法也是种很好的选择,实现方法更精简了 当然最好是使用PreferenceFragmentCompat方法,后续有时间再更新吧

package com.ywjh.settingsbyprenference;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;


import android.os.Bundle;
import androidx.preference.PreferenceFragment;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public static class SettingsFragment extends PreferenceFragment {
//        @Override
//        public void onCreate(@Nullable Bundle savedInstanceState) {
//            super.onCreate(savedInstanceState);
//            addPreferencesFromResource(R.xml.settingsfragment);
//        }

        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            addPreferencesFromResource(R.xml.settingsfragment);
        }


    }
}

 

2.22实现需要调用的layout布局【activity_main.xml】 并且将之前写好的关于Preference的xml布局以fragment布局添加进来

通过 android:name表面完成主类-》实现类

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <fragment
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/settingsFragment"
            android:name="com.ywjh.settingsbyprenference.MainActivity$SettingsFragment"/>

</androidx.constraintlayout.widget.ConstraintLayout>

 

实测不加id会报错,补上就完成啦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章