La comprensión y el uso de Preferencia en la configuración de Android

      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! ! !

Supongo que te gusta

Origin blog.csdn.net/hhbstudy/article/details/128304762
Recomendado
Clasificación