Android 8.0에서는 설정 메뉴에 확장 검색 기능이 추가됩니다. 이 문서에서는 설정을 추가하고 설정 검색에 설정에 관한 색인이 제대로 생성되었는지 확인하는 방법을 설명합니다.
색인 생성이 가능한 설정 생성
색인 생성이 필요한 각 설정 프래그먼트는 Indexable
인터페이스를 구현하며 정적 필드가 필요합니다.
public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER
색인 생성을 위한 프래그먼트를 설정한 후에는 SearchIndexableResources
에 추가합니다. 코드 위치:packages/apps/Settings/src/com/android/settings/search/SearchIndexableResources.java
선택적 메서드
이 SearchIndexProvider
인터페이스에는 4개의 선택적 메서드가 있습니다.
getXmlResourcesToIndex
preference xml
의 프래그먼트 콘텐츠인 경우 이를 재정의합니다.- XML 환경설정을 색인이 생성될 목록으로 반환합니다.
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
preference xml
의 프래그먼트 콘텐츠가 아닌 경우 이를 재정의합니다.- 색인을 생성할 원시 데이터(
SearchIndexableRaw
) 목록을 반환합니다.
원시 데이터 예시:
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
- 프래그먼트가
DashboardFragment
인 경우 이를 재정의할 필요가 거의 없습니다. - 주어진 사용자, 기기, 구성 등에 표시되면 안 되는 결과에 상응하는 키 목록을 반환합니다. 여기서 제공된 키는
SearchIndexableResource
및SearchIndexableRaw
의 KEY 필드와 일치해야 합니다. - 예를 들어 데이터 사용량은 기기에 SIM 카드를 보유했던 적이 없는 사용자에게 표시되면 안 됩니다.
색인을 생성할 수 없는 키 예시:
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
이 프래그먼트와 관련된 환경설정 컨트롤러 목록을 반환합니다. 이 목록은 인라인 결과를 형성하고 색인을 생성할 수 없는 항목을 업데이트하는 등의 용도로 사용됩니다.
따라서 검색에 표시할 모든 내용이 getXmlResourcesToIndex
또는 getRawDataToIndex
에 포함되어야 합니다.
설정에 키워드 추가하기
설정을 쉽게 검색할 수 있도록 사용자가 설정을 검색하는 데 사용할 수 있는 설정 관련 키워드를 추가합니다.
키워드 추가 시 고려사항:
- 키워드는 반드시 표시되는 것은 아니지만 사용자가 설정의 작동 방식을 생각할 때 떠올릴 수 있는 단어 목록입니다.
- 사용자가 설정을 가져오기 위해 입력할 수 있는 단어입니다.
- 동의어 또는 설정과 관련된 모든 단어를 사용할 수 있습니다.
- 예를 들어 '음소거'는 음량 설정을 찾는 데 사용할 수 있습니다.
중복 방지
무조건 설정 페이지를 표시하지 않으려면 원본 페이지의 색인을 삭제하여 결과가 중복되지 않도록 합니다.
- 표시하지 않으려는 페이지의
PreferenceFragment
를 찾습니다. SearchIndexProvider
를 제거합니다.
유효성 검사
새 설정의 검색 가능성을 테스트하는 방법:
- 기기에 O의 최신 버전을 설치합니다.
- 다음을 선택하여 데이터베이스 색인을 다시 생성합니다. 설정 > 앱 및 알림 > 앱 정보 > 설정 > 저장용량 > 데이터 지우기
- 타겟 설정이 검색결과에 표시되는지 확인합니다.
설정 제목의 접두사를 검색하면 일치합니다.
이러한 robolectric 테스트를 실행하면 다음 기능의 구현을 검증할 수 있습니다.packages/apps/Settings/tests/robotests/src/com/android/settings/search
빌드 타겟: RunSettingsRoboTests