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