Preference 是Android App 中重要的控件之一,Settings 模块大部分都是通过 Preference 实现
Preference 可以自动显示我们上次设置的数据,Android提供preference这个键值对的方式来处理这种情况,自动保存这些数据,并立时生效,无需用户自己保存操作,只需要在xml中定义对应的Preference控件即可。
PreferenceActivity是一个非常有用的基类,当我们开发Android项目时避免不了选项设置,这些设置习惯用Preference来保存。Android专门为这种Activity提供了便捷的基PreferenceActivity。如果继承自Preference则不需要自己控制Preference的读写,PreferenceActivity会为我们处理一切。
PreferenceActivity与普通的Activity不同,它不是使用界面布局文件,而是使用选项设置的布局文件。选项设置布局文件以PreferenceScreen作为根元素来表示定义一个参数设置界面布局。
从Android 3.0以后官方不再推荐直接让PreferenceActivity加载选项设置布局文件,而是建议使用PreferenceFragment,PreferenceFragment 源码布局实际就是一个RecyclerView,通过读取Preference的布局来作为其item,通过adapter适配器展示
1.preference常用控件
Preference 控件家庭 View控件家庭 控件含义
Preference TextView 文本框
CheckPreference CheckBox 单选框
EditTextPreference EditText 输入文本框
ListPreference ListView 列表框
RingtonePreference —— 铃声
PreferenceCategory 类似于LinearLayou、RelativeLayout,用于组合一组Preference,使布局更具备层次感 。
PreferenceScreen 所有Preference元素的根节点
2.使用 需要加入依赖
implementation ("androidx.preference:preference:1.2.0-alpha01")
(1)在res文件下定义xml文件夹,定义 test.xml;如下
(2)xml文件中是定义的preference控件
(3)新建类PrefFragment.java,让其继承PreferenceFragment,并加载选项设置的布局文件:(核心代码是第6行和13行)
package com.android.test3.fragment;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.preference.PreferenceFragmentCompat;
import com.android.test3.R;
/**
* @author hudebo
* @desc
* @date 2022/11/11
*/
public class PowerFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
//从xml文件加载选项
setPreferencesFromResource(R.xml.pref_two, rootKey);
}
}
(4)然后,在MainActivity.java中加载上面的Fragment:
package com.android.test3;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import com.android.test3.fragment.PowerFragment;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportFragmentManager().beginTransaction().replace(
R.id.content,new PowerFragment() ).commitAllowingStateLoss();
}
}
有时候原生的preference满足不了我们的需求,比如,加个背景,加个其他控件等;此时就需要我们自定义控件解决
比如:(1)给布局设置背景;我们继承Preference;在onBindViewHolder 方法中对通过holder获取控件其进行设置
package com.android.test3.prefence;
import android.content.Context;
import android.util.AttributeSet;
import androidx.core.content.res.TypedArrayUtils;
import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;
import com.android.test3.PrefenceFeatureManager;
import com.android.test3.R;
/**
* @author hudebo
* @desc 自定义子Preference 支持圆角; 去除summary 支持icon title
* @date 2022/11/24
*/
public class LuxPreference extends Preference {
public LuxPreference(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
public LuxPreference(Context context, AttributeSet attrs) {
this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.luxPreferenceStyle,
android.R.attr.preferenceStyle));
}
public LuxPreference(Context context) {
this(context, null);
}
public LuxPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
public void onBindViewHolder(PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
if (holder != null) {
PrefenceFeatureManager.setPrefenceBackground(this, holder.itemView);
}
}
}
(2)修改布局控件;a.首先我们在layout中定义绘制你的布局样式
b.在自定义控件中引入你的布局即可
声明:setLayoutResource 方法即是覆盖原始preference的主布局;setWidgetLayoutResource 方法是覆盖原始布局的WidgetLayout的控件;如下图是preference的源码布局;
setLayoutResource 是替换除了"@android:id/widget_frame" 这个控件的部分;setWidgetLayoutResource只是替换"@android:id/widget_frame"部分;如果setWidgetLayoutResource不设置也不影响;说明你得,右边没有布局
以上就是一些个人理解;像通用的preference属性;以及点击等相关方法后续介绍; 喜欢的点个赞吧!!!