【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會報錯,補上就完成啦

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