Android 8.0 agrega capacidades de búsqueda ampliadas para el menú Configuración. En este documento, se describe cómo agregar un parámetro de configuración y garantizar que se indexe correctamente para la búsqueda de Configuración.
Crea parámetros de configuración indexables
Cada fragmento de configuración que se debe indexar implementa la interfaz Indexable
Y requiere el campo estático:
public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER
Después de configurar el fragmento para el indexado, agrégalo a SearchIndexableResources
, que se encuentra en:
packages/apps/Settings/src/com/android/settings/search/SearchIndexableResources.java
Métodos opcionales
Esta interfaz SearchIndexProvider
tiene cuatro métodos opcionales.
getXmlResourcesToIndex
- Anula esta opción si el contenido de tu fragmento proviene de las siguientes fuentes:
preference xml
- Muestra una preferencia XML como una lista para indexar.
Ejemplo de recursos XML:
public List<SearchIndexableResource> getXmlResourcesToIndex(Context context, boolean enabled) { ArrayList<SearchIndexableResource> result = new ArrayList<SearchIndexableResource>(); SearchIndexableResource sir = new SearchIndexableResource(context); sir.xmlResId = R.xml.display_settings; result.add(sir); return result; }
getRawDataToIndex
- Anula esta opción si el contenido de tu fragmento NO proviene de las siguientes fuentes:
preference xml
- Muestra una lista de datos sin procesar (
SearchIndexableRaw
) que se indexarán.
Ejemplo de datos sin procesar:
public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) { final List<SearchIndexableRaw> result = new ArrayList<>(); final Resources res = context.getResources(); // Add fragment title SearchIndexableRaw data = new SearchIndexableRaw(context); data.title = res.getString(R.string.wifi_settings); data.screenTitle = res.getString(R.string.wifi_settings); data.keywords = res.getString(R.string.keywords_wifi); data.key = DATA_KEY_REFERENCE; result.add(data); return result; }
getNonIndexableKeys
- Si tu fragmento es un
DashboardFragment
, rara vez necesitarás reemplazarlo. - Muestra una lista de claves que corresponden a resultados que no deberían aparecer para el usuario, el dispositivo, la configuración, etcétera, determinados.Las claves proporcionadas aquí deben coincidir con el campo KEY en
SearchIndexableResource
ySearchIndexableRaw
. - Por ejemplo, el uso de datos no debería aparecer para los usuarios que nunca tuvieron una tarjeta SIM en su dispositivo.
Ejemplo de claves no indexables:
public List<String> getNonIndexableKeys(Context context) { final List<String> keys = super.getNonIndexableKeys(context); if (!checkIntentAction(context, "android.settings.TERMS")) { keys.add(KEY_TERMS); } if (!checkIntentAction(context, "android.settings.LICENSE")) { keys.add(KEY_LICENSE); } if (!checkIntentAction(context, "android.settings.COPYRIGHT")) { keys.add(KEY_COPYRIGHT); } if (!checkIntentAction(context, "android.settings.WEBVIEW_LICENSE")) { keys.add(KEY_WEBVIEW_LICENSE); } return keys; }
getPreferenceControllers
Muestra una lista de controladores de preferencias asociados con este fragmento. Esta lista se usa para formar resultados intercalados, actualizar elementos no indexables, etcétera.
Por lo tanto, todo lo que deseas que aparezca en la búsqueda debe incluirse en getXmlResourcesToIndex
o getRawDataToIndex
.
Agrega palabras clave para tu configuración
Para garantizar que un parámetro de configuración sea fácil de buscar, agrega palabras clave relevantes para el parámetro de configuración que un usuario podría usar para buscarlo.
Aspectos que debes tener en cuenta cuando agregues palabras clave:
- Las palabras clave son una lista de palabras que el usuario no necesariamente ve, pero que pueden ser parte de su modelo mental sobre cómo funciona la configuración.
- Estas son palabras que el usuario podría escribir para acceder a tu configuración.
- Pueden ser sinónimos o cualquier palabra asociada al parámetro de configuración.
- Por ejemplo, se puede usar "silenciar" para encontrar el parámetro de configuración de volumen.
Evita la duplicación
Si suprimes una página de configuración de forma incondicional, quita el indexado de la página original para evitar la duplicación de resultados.
- Busca el
PreferenceFragment
de la página que quieres suprimir. - Quita el
SearchIndexProvider
.
Validación
Para probar la capacidad de búsqueda de un parámetro de configuración nuevo, sigue estos pasos:
- Instala una versión reciente de O en el dispositivo.
- Para volver a indexar la base de datos, selecciona lo siguiente: Configuración > Apps y notificaciones > Información de la app > Configuración > Almacenamiento > Borrar datos
- Verifica que la configuración de segmentación aparezca en la búsqueda.
Si buscas un prefijo del título de un parámetro de configuración, se hará coincidir.
Se pueden ejecutar estas pruebas de robolectric para validar la implementación de esta función:
packages/apps/Settings/tests/robotests/src/com/android/settings/search
El destino de compilación es: RunSettingsRoboTests