La preferencia es uno de los controles importantes en la aplicación de Android, y la mayor parte del módulo de Configuración se implementa a través de Preferencia
ventaja:
La preferencia puede mostrar automáticamente los datos que configuramos la última vez. Android proporciona el par clave-valor de preferencia para hacer frente a esta situación, guardar automáticamente estos datos y tener efecto de inmediato. No es necesario que el usuario guarde la operación por sí mismo, solo es necesario definir la Preferencia correspondiente en los controles xml.
PreferenceActivity和PreferenceFragment:
PreferenceActivity es una clase base muy útil, cuando desarrollamos proyectos de Android, no se puede evitar la configuración de opciones, estas configuraciones se utilizan para guardar con preferencia. Android proporciona una PreferenceActivity base conveniente específicamente para este tipo de actividad. Si hereda de Preference, no necesita controlar la lectura y escritura de Preference usted mismo, PreferenceActivity se encargará de todo por nosotros.
PreferenceActivity es diferente de la actividad ordinaria. No utiliza archivos de diseño de interfaz, sino archivos de diseño que usan configuraciones de opciones. El archivo de diseño de configuración de opciones utiliza PreferenceScreen como elemento raíz para definir un diseño de interfaz de configuración de parámetros.
Desde Android 3.0, ya no se recomienda oficialmente dejar que PreferenceActivity cargue directamente las opciones para configurar el archivo de diseño. En su lugar, se recomienda usar PreferenceFragment. El diseño del código fuente de PreferenceFragment es en realidad un RecyclerView, que lee el diseño de Preference como su elemento y lo muestra a través del adaptador adaptador.
Introducción y uso de preferencia
1. Controles de preferencia comúnmente utilizados
Familia de control de preferencia Ver familia de control Significado de control
Cuadro de texto Preferencia TextView
Botón de radio CheckPreference CheckBox
EditTextPreference Cuadro de texto de entrada de EditText
Cuadro de lista ListPreference ListView
RingtonePreference - Tono de llamada
PreferenceCategory es similar a LinearLayout y RelativeLayout, y se usa para combinar un conjunto de Preferencias para hacer que el diseño tenga más capas.
PreferenceScreen El nodo raíz de todos los elementos de preferencia
2. El uso necesita agregar dependencias
implementation ("androidx.preference:preference:1.2.0-alpha01")
(1) Defina la carpeta xml debajo del archivo res y defina test.xml, de la siguiente manera
(2) El control de preferencia se define en el archivo xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:settings="http://schemas.android.com/tools">
<PreferenceCategory
android:key="test2"
android:title="第二组设置">
<CheckBoxPreference
android:defaultValue="false"
android:key="g2_checkbox_key"
android:summaryOff="关"
android:summaryOn="开"
android:title="第二组设置勾选" />
<ListPreference
android:dialogIcon="@android:drawable/stat_sys_warning"
android:dialogTitle="第二组列表设置"
android:key="g2_list_key"
android:summary="选择"
android:title="第一组列表设置" />
</PreferenceCategory>
<SwitchPreference
android:defaultValue="false"
android:key="show_advanced_setting"
android:summary="高级设置"
android:title="显示高级设置" />
<PreferenceCategory android:key="yh">
<com.android.test3.prefence.RestrictedSwitchPreference
android:defaultValue="true"
android:icon="@drawable/ic_settings_wireless"
android:key="login_dji_account"
android:title="蓝牙" />
<com.android.test3.prefence.RestrictedSwitchPreference
android:defaultValue="true"
android:icon="@drawable/ic_launcher_background"
android:key="login_dji_account1"
app:allowDividerAbove="true"
android:title="网络" />
<com.android.test3.prefence.RestrictedPreference
android:icon="@drawable/ic_launcher_background"
android:key="internet_settings"
android:order="20"
android:summary=" SAA"
android:title="互联网"
app:allowDividerAbove="true"
settings:keywords="@string/keywords_internet"
settings:useAdminDisabledSummary="true" />
<com.android.test3.prefence.LuxPreference
android:icon="@drawable/ic_settings_wireless"
android:summary="ww"
app:allowDividerAbove="true"
android:title="测试自动" />
<com.android.test3.prefence.LuxArrowPreference
android:icon="@drawable/ic_settings_wireless"
android:summary="ww"
android:title="开始" />
</PreferenceCategory>
</PreferenceScreen>
(3) Cree una nueva clase PrefFragment.java, deje que herede PreferenceFragment y cargue el archivo de diseño para la configuración de opciones: (el código central es la línea 6 y la línea 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) Luego, cargue el Fragmento anterior en MainActivity.java :
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();
}
}
Preferencias personalizadas
A veces, la preferencia original no puede satisfacer nuestras necesidades, por ejemplo, agregar un fondo, agregar otros controles, etc.; en este momento, necesitamos personalizar el control para resolverlo.
Por ejemplo: (1) Establecer el fondo para el diseño; heredamos Preferencia; en el método onBindViewHolder, establezca el control obtenido a través del titular
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) Modifique el control de diseño: a. Primero, definimos y dibujamos su estilo de diseño en el diseño
b. Introduzca su diseño en el control personalizado
Declaración: El método setLayoutResource es el diseño principal que cubre la preferencia original; el método setWidgetLayoutResource es el control WidgetLayout que cubre el diseño original; la siguiente figura es el diseño del código fuente de la preferencia;
setLayoutResource es para reemplazar la parte del control excepto "@android:id/widget_frame"; setWidgetLayoutResource simplemente reemplaza la parte de "@android:id/widget_frame"; si setWidgetLayoutResource no está configurado, no lo afectará; significa que tiene a, no hay diseño a la derecha
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2015 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
android:gravity="center_vertical"
android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingRight="?android:attr/listPreferredItemPaddingRight"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:background="?android:attr/selectableItemBackground"
android:clipToPadding="false"
android:baselineAligned="false">
<include layout="@layout/image_frame"/>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingTop="16dp"
android:paddingBottom="16dp">
<TextView
android:id="@android:id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceListItem"
android:ellipsize="marquee"/>
<TextView
android:id="@android:id/summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@android:id/title"
android:layout_alignLeft="@android:id/title"
android:layout_alignStart="@android:id/title"
android:layout_gravity="start"
android:textAlignment="viewStart"
android:textColor="?android:attr/textColorSecondary"
android:maxLines="10"
style="@style/PreferenceSummaryTextStyle"/>
</RelativeLayout>
<!-- Preference should place its actual preference widget here. -->
<LinearLayout
android:id="@android:id/widget_frame"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="end|center_vertical"
android:paddingLeft="16dp"
android:paddingStart="16dp"
android:paddingRight="0dp"
android:paddingEnd="0dp"
android:orientation="vertical"/>
</LinearLayout>
Los anteriores son algunos entendimientos personales; como el atributo de preferencia general; y la introducción de seguimiento de métodos relacionados, como hacer clic; si te gusta, ¡dale un pulgar hacia arriba! ! !