Cómo personalizar la configuración Parte de Android Jetpack.
En este documento, se describe cómo personalizar
Preference
en tu jerarquía.
Buscar preferencias
Para acceder a un objeto Preference
individual, como cuando recibes o configuras un valor Preference
, usa PreferenceFragmentCompat.findPreference()
.
Este método busca en toda la jerarquía un objeto Preference
con la clave determinada.
Por ejemplo, para acceder a un
EditTextPreference
con un
de "signature"
, haz lo siguiente:
<EditTextPreference
app:key="signature"
app:title="Your signature"/>
Recupera este Preference
con el siguiente código:
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.preferences, rootKey)
val signaturePreference: EditTextPreference? = findPreference("signature")
// Do something with this preference.
}
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.preferences, rootKey);
EditTextPreference signaturePreference = findPreference("signature");
// Do something with this preference.
}
Cómo controlar la visibilidad de objetos Preference
Puedes controlar qué objetos Preference
son visibles para el usuario cuando
navega a una pantalla de configuración. Por ejemplo, si un objeto Preference
en particular es significativo solo cuando se habilita una función correspondiente, es posible que quieras ocultar ese objeto Preference
cuando la función está inhabilitada.
Para mostrar un Preference
solo cuando se cumpla una condición, primero establece Preference
.
visibilidad como false en el XML, como se muestra en el siguiente ejemplo:
<EditTextPreference
app:key="signature"
app:title="Your signature"
app:isPreferenceVisible="false"/>
En onCreatePreferences()
, muestra Preference
cuando el valor correspondiente
se cumple esta condición:
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.preferences, rootKey)
if(/*some feature*/) {
val signaturePreference: EditTextPreference? = findPreference("signature")
signaturePreference?.isVisible = true
}
}
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.preferences, rootKey);
if(/*some feature*/) {
EditTextPreference signaturePreference = findPreference("signature");
if (signaturePreference != null) {
signaturePreference.setVisible(true);
}
}
}
Cómo actualizar resúmenes de manera dinámica
Una Preference
con datos persistentes debe mostrar el valor actual en su
summary para ayudar al usuario a comprender mejor el estado actual del
Preference
Por ejemplo, un elemento EditTextPreference
debe mostrar el texto guardado.
y una ListPreference
debe mostrar la entrada de la lista seleccionada. También puedes
tienen objetos Preference
que deben actualizar su resumen según datos internos o
estado de la app externa, por ejemplo, un objeto Preference
que muestra una versión
de la fila. Puedes hacer esto con un
SummaryProvider
Cómo usar un objeto SimpleSummaryProvider
ListPreference
y EditTextPreference
incluyen implementaciones de SummaryProvider
simples que muestran automáticamente el valor de Preference
guardado como resumen. Si no se guarda ningún valor, se muestra "No
".
Para habilitar estas implementaciones desde XML, configura
app:useSimpleSummaryProvider="true"
Como opción, en el código, puedes usar ListPreference.SimpleSummaryProvider.getInstance()
y EditTextPreference.SimpleSummaryProvider.getInstance()
para obtener la instancia de SummaryProvider
simple y, luego, configurarla en el objeto Preference
, tal como se muestra en el siguiente ejemplo:
listPreference.summaryProvider = ListPreference.SimpleSummaryProvider.getInstance()
editTextPreference.summaryProvider = EditTextPreference.SimpleSummaryProvider.getInstance()
listPreference.setSummaryProvider(ListPreference.SimpleSummaryProvider.getInstance());
editTextPreference.setSummaryProvider(EditTextPreference.SimpleSummaryProvider.getInstance());
Cómo usar un objeto SummaryProvider personalizado
Puedes crear tu propio objeto SummaryProvider
y anular el objeto provideSummary()
para personalizar el resumen siempre que lo solicite el objeto Preference
. Para
Por ejemplo, el siguiente elemento EditTextPreference
muestra la longitud de su almacenamiento
valor que el resumen:

EditTextPreference
de ejemplo.
A modo de ejemplo, supongamos lo siguiente EditTextPreference
:
<EditTextPreference
app:key="counting"
app:title="Counting preference"/>
En onCreatePreferences()
, puedes crear un nuevo elemento SummaryProvider
y anularlo.
provideSummary()
para mostrar el resumen que se mostrará:
val countingPreference: EditTextPreference? = findPreference("counting")
countingPreference?.summaryProvider = SummaryProvider<EditTextPreference> { preference ->
val text = preference.text
if (text.isNullOrEmpty()) {
"Not set"
} else {
"Length of saved value: " + text.length
}
}
EditTextPreference countingPreference = findPreference("counting");
if (countingPreference != null) {
countingPreference.setSummaryProvider(new SummaryProvider<EditTextPreference>() {
@Override
public CharSequence provideSummary(EditTextPreference preference) {
String text = preference.getText();
if (TextUtils.isEmpty(text) || text == null){
return "Not set";
}
return "Length of saved value: " + text.length();
}
});
}
El resumen de Preference
muestra la longitud del valor guardado o "Sin establecer"
cuando no hay un valor guardado.
Cómo personalizar un diálogo EditTextPreference
En un diálogo EditTextPreference
, puedes personalizar el comportamiento del campo de texto si haces lo siguiente:
adjuntar un
OnBindEditTextListener
Este objeto de escucha se invoca cuando se muestra el diálogo al usuario.
A modo de ejemplo, puedes personalizar un diálogo para que solo acepte números. Primero, crea
EditTextPreference
:
<EditTextPreference
app:key="number"
app:title="Numbers only preference"/>
A continuación, en onCreatePreferences()
, crea un nuevo elemento OnBindEditTextListener
y
anula onBindEditText()
para personalizar el objeto EditText
cuando se muestra
usuario.
val numberPreference: EditTextPreference? = findPreference("number")
numberPreference?.setOnBindEditTextListener { editText ->
editText.inputType = InputType.TYPE_CLASS_NUMBER
}
EditTextPreference numberPreference = findPreference("number");
if (numberPreference != null) {
numberPreference.setOnBindEditTextListener(
new EditTextPreference.OnBindEditTextListener() {
@Override
public void onBindEditText(@NonNull EditText editText) {
editText.setInputType(InputType.TYPE_CLASS_NUMBER);
}
});
}
Ahora, cuando se muestra el diálogo al usuario, el teclado se abre en formato numérico
para que el usuario solo pueda ingresar números en EditText
.
Acciones de Preference
Un objeto Preference
puede ejercer una acción específica cuando se lo presiona. Por ejemplo, un
Preference
puede actuar como vínculo a una parte independiente de tu app. Cómo agregar una acción
a Preference
, puedes establecer un Intent
en el Preference
directamente o
puede establecer un
OnPreferenceClickListener
para obtener una lógica más específica.
Cómo configurar un elemento Intent
Puedes configurar un Intent
en un Preference
para iniciar un nuevo Fragment
.
Activity
o una app independiente cada vez que se presiona Preference
. Este es el
lo mismo que usar
Context.startActivity()
con un objeto Intent
determinado.
Puedes configurar un elemento Intent
en el archivo XML si usas una etiqueta <intent>
anidada. Lo siguiente
El ejemplo define un Intent
que inicia un Activity
:
<Preference
app:key="activity"
app:title="Launch activity">
<intent
android:targetPackage="com.example"
android:targetClass="com.example.ExampleActivity"/>
</Preference>
Como alternativa, puedes usar setIntent()
directamente en un Preference
, de la siguiente manera:
val intent = Intent(context, ExampleActivity::class.java)
activityPreference.setIntent(intent)
Intent intent = new Intent(getContext(), ExampleActivity.class);
activityPreference.setIntent(intent);
También puedes incluir servicios adicionales con un Intent
mediante XML:
<Preference
app:key="activity"
app:title="Launch activity">
<intent
android:targetPackage="com.example"
android:targetClass="com.example.ExampleActivity">
<extra
android:name="example_key"
android:value="example_value"/>
</intent>
</Preference>
Aquí se muestra un ejemplo de un objeto Preference
con un elemento Intent
que abre una página web:
<Preference
app:key="webpage"
app:title="View webpage">
<intent
android:action="android.intent.action.VIEW"
android:data="http://www.google.com" />
</Preference>
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse("http://www.google.com")
val webpagePreference = findPreference
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.google.com"));
webpagePreference.setIntent(intent);
OnPreferenceClickListener
Puedes configurar un OnPreferenceClickListener
en un Preference
, lo que agrega un
Es la devolución de llamada a onPreferenceClick()
cuando se presiona Preference
. Por ejemplo:
puedes usar el objeto de escucha para navegar a otro Fragment
o Activity
si
tienen una lógica más compleja para manejar la navegación.
Para configurar un objeto OnPreferenceClickListener
, usa código similar al siguiente:
onClickPreference.setOnPreferenceClickListener({
// Do something.
true
})
onClickPreference.setOnPreferenceClickListener(preference -> {
// Do something.
return true;
});