大家好,又见面了,我是你们的朋友全栈君。
调用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中加入支持库
代码语言:javascript复制//implementation 'com.android.support:preference-v7:28.0.0-alpha1'
下面正式开始
1:文件的结构是:一个MainActivity,一个对应layout布局,一个可引入的XML碎片布局
2.具体内容
2.1 【settingsfragment.xml 】 一个布局碎片 使用<PreferenceScreen>标签作为最外层包裹,写好不用管了供以后调用
代码语言:javascript复制<?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
代码语言:javascript复制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方法,后续有时间再更新吧
代码语言:javascript复制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表面完成主类-》实现类
代码语言:javascript复制<?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会报错,补上就完成啦
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/197778.html原文链接:https://javaforall.cn