2025년 3월 27일부터 AOSP를 빌드하고 기여하려면 aosp-main
대신 android-latest-release
를 사용하는 것이 좋습니다. 자세한 내용은 AOSP 변경사항을 참고하세요.
런타임 리소스 오버레이로 툴바 맞춤설정
컬렉션을 사용해 정리하기
내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
기본 레이아웃 개요
car-ui-lib 툴바는 car_ui_base_layout_toolbar.xml
레이아웃 파일을 통해 맞춤설정됩니다. 이 툴바는 *기본 레이아웃* 툴바라고 합니다. 이 레이아웃 파일에는 ID가 car_ui_base_layout_content_container
인 FrameLayout
이 포함되어 있으며 여기에는 레이아웃이 확장된 직후 앱 콘텐츠가 모두 포함되기 때문입니다. 이 구조를 통해 OEM은 화면 상단 이외의 위치에 툴바를 배치할 수 있습니다.
car_ui_base_layout_content_container
의 레이아웃 매개변수를 변경하면 앱을 더 작은 영역으로 압축하여 툴바를 위한 공간을 확보할 수 있습니다. 그러나 일부 맞춤설정에서는 툴바를 투명하게 하고 앱 위에 오버레이해야 할 수도 있습니다. 이 경우 뷰에 car_ui_top/bottom/left/right_inset
으로 태그를 지정할 수 있습니다. car-ui-lib가 이러한 태그가 달린 뷰를 감지하면 이 뷰의 위치와 크기를 앱에 전달하므로 콘텐츠를 그만큼 안쪽으로 들여쓰면서도 툴바 아래 공간에 적절한 백그라운드를 계속 유지할 수 있습니다. 예를 들어 대부분의 앱은 CarUiRecyclerView의 첫 번째 항목이 지정된 인셋 아래에서 시작하지만 사용자가 아래로 스크롤할 때 툴바 뒤에 계속 표시됩니다.
로터리 지원
로터리 컨트롤러를 지원하려면 기본 레이아웃에서 레이아웃에 최대한 빨리 FocusParkingView
를 포함해야 합니다. 이 뷰는 사용자에게 표시되는 포커스가 없을 때 포커스가 맞춰지는 부분입니다. 툴바는 또한 로터리 컨트롤러를 위한 별도의 중요한 이동 영역임을 지정하는 FocusParkingView
에 래핑되어야 합니다. FocusParkingView에 래핑되지 않으면 사용자가 로터리 컨트롤러로 툴바와 상호작용할 수 없습니다.
탭
툴바 탭은 car_ui_toolbar_tab_item.xml
또는 car_ui_toolbar_tab_item_flexible.xml
레이아웃 파일로 맞춤설정됩니다. 두 파일 간에 기능적 차이는 없으며 car_ui_toolbar_tab_flexible_layout
부울 리소스는 사용될 파일을 결정합니다. 따라서 car_ui_toolbar_tab_flexible_layout
을 false
로 계속 설정하고 일반 레이아웃 파일만 맞춤설정하는 것이 좋습니다.
탭의 ImageView
는 자바 코드에서 색상 car_ui_toolbar_tab_item_selector
로 색조가 조정되므로 car_ui_toolbar_tab_item_selector
를 레이아웃과 함께 맞춤설정해야 합니다. 앱에서 탭 아이콘에 이 색상으로 색조가 조정되지 않도록 요청할 수 있습니다.
탭의 TextView
는 자바 코드에서 텍스트 모양을 TextAppearance.CarUi.Widget.Toolbar.Tab
또는 TextAppearance.CarUi.Widget.Toolbar.Tab.Selected
로 설정하므로 레이아웃 파일에 설정된 텍스트 모양이 적용되지 않습니다. 이러한 스타일도 맞춤설정해야 합니다.
MenuItems
는 기본 툴바 오른쪽 상단에 있는 버튼입니다. 텍스트나 아이콘, 아이콘과 텍스트 또는 스위치일 수 있습니다. 이러한 변형은 모두 car_ui_toolbar_menu_item
레이아웃 파일의 일부입니다. MenuItems
는 앱에서 요청하면 각 형식 간에 변경될 수 있어야 하기 때문입니다.
MenuItems
는 다른 레이아웃 파일 car_ui_toolbar_menu_item_primary
를 확장하는 기본일 수 있습니다. 기본 MenuItem은 일반 MenuItem과 시각적으로 구별되어야 합니다(예: 테두리가 있는/없는 버튼을 통해). 기본적으로 car_ui_toolbar_menu_item_primary
는 car_ui_toolbar_menu_item
으로 리디렉션되므로 똑같아 보입니다.
MenuItems
는 활성화될 수 있습니다. 이는 MenuItem이 전환된다는 것을 나타내는 또 다른 시각적 상태입니다. 이 상태는 MenuItem 뷰에서 setActivated(true)
를 호출하여 구현되며 이는 state_activated
상태를 MenuItem 뷰의 모든 드로어블에 추가합니다. 이 드로어블 상태는 런타임 리소스 오버레이(RRO)의 드로어블 선택기로 응답할 수 있습니다.
차량이 이동할 때 MenuItems
가 UX 제한될 수 있습니다. UX 제한은 활성화와 같은 하나의 드로어블 상태이지만 이번에는 상태가 Android 프레임워크 대신 앱에서 정의됩니다. 즉, RRO에 정의된 속성이 앱에 정의된 속성과 일치하도록 state_ux_restricted
속성도 RRO로 오버레이해야 합니다.
검색
검색창은 별도의
car_ui_toolbar_search_view
레이아웃 파일에 포함되어 있으므로 검색창이 필요하지 않은 앱의 레이아웃 확장 성능이 향상됩니다. ID가
car_ui_toolbar_search_view_container
인
FrameLayout
은 확장될 때 검색창을 포함합니다.
이 페이지에 나와 있는 콘텐츠와 코드 샘플에는 콘텐츠 라이선스에서 설명하는 라이선스가 적용됩니다. 자바 및 OpenJDK는 Oracle 및 Oracle 계열사의 상표 또는 등록 상표입니다.
최종 업데이트: 2024-05-07(UTC)
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["필요한 정보가 없음","missingTheInformationINeed","thumb-down"],["너무 복잡함/단계 수가 너무 많음","tooComplicatedTooManySteps","thumb-down"],["오래됨","outOfDate","thumb-down"],["번역 문제","translationIssue","thumb-down"],["샘플/코드 문제","samplesCodeIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 2024-05-07(UTC)"],[],[],null,["# Customize the toolbar with runtime resource overlays\n\nBase layout overview\n--------------------\n\nThe car-ui-lib toolbar is customized through the `car_ui_base_layout_toolbar.xml`\nlayout file. It's called the \\*base layout\\* toolbar because this layout file\ncontains a `FrameLayout` with id `car_ui_base_layout_content_container`, which\nwill contain all of the app's content shortly after the layout is inflated. This structure lets\nthe OEM place the toolbar in locations other than the top of the screen.\n\n| Possible layouts |||\n|---|---|---|\n| | | |\n| | | |\n\nBy changing the layout parameters on the `car_ui_base_layout_content_container`, the\napp can be compressed into a smaller area to make space for the toolbar. However, some\ncustomizations may call for the toolbar to be transparent and overlaid on top of the app. In this\ncase, views can be tagged with `car_ui_top/bottom/left/right_inset`. If car-ui-lib\ndetects a view with such a tag, it communicates the position and dimensions of that view to the app,\nso it can indent its content inward by that amount, but still keep a reasonable background in the\nspace underneath the toolbar. For example, most apps will have the first item in their\nCarUiRecyclerView start below the specified insets, but still be visible behind the toolbar when the\nuser scrolls down.\n\nRotary support\n--------------\n\nTo support rotary controllers, the base layout must contain a `FocusParkingView` as\nearly as possible in the layout. This view is what gets focused when there is no focus\nvisible to the user. The toolbar must also be wrapped in a `FocusParkingView`, which\nspecifies that it's a separate nudge zone for the rotary controller. If it is not wrapped in a\nFocusParkingView, then the user can't interact with the toolbar with the rotary controller.\n\nTabs\n----\n\nToolbar tabs are customized by either the `car_ui_toolbar_tab_item.xml` or\n`car_ui_toolbar_tab_item_flexible.xml` layout files. There is no functional difference\nbetween the files, the `car_ui_toolbar_tab_flexible_layout` Boolean resource determines\nwhich is used. As a result, it's recommended to keep `car_ui_toolbar_tab_flexible_layout`\nset to `false` and only customize the regular layout file.\n\nThe tab's `ImageView` will be tinted with the color\n`car_ui_toolbar_tab_item_selector` in Java code, so\n`car_ui_toolbar_tab_item_selector` must be customized alongside the layout. Apps can\nrequest that their tab's icons not be tinted with this color as well.\n\nThe tab's `TextView` has its text appearance set to either\n`TextAppearance.CarUi.Widget.Toolbar.Tab` or\n`TextAppearance.CarUi.Widget.Toolbar.Tab.Selected` in Java code, so the text appearance\nset on the layout file won't apply. These styles must be customized as well.\n\nMenuItems\n---------\n\n`MenuItems` are the buttons in the top right corner of the default toolbar. They can\nbe text, icons, icons and text, or switches. These variations are all part of the\n`car_ui_toolbar_menu_item` layout file, as the `MenuItems` need to be able to\nchange between each form if the app requests it.\n\n`MenuItems` can be *primary* , which inflates a different layout file:\n`car_ui_toolbar_menu_item_primary`. A primary MenuItem must look visually\ndistinct from the normal MenuItem, for example via a bordered/borderless button. By default,\n`car_ui_toolbar_menu_item_primary` just redirects to\n`car_ui_toolbar_menu_item`, so they look the same.\n\n`MenuItems` can be *activated* , which is another visual state that indicates\nthat this MenuItem is toggled. This state is implemented by calling `setActivated(true)`\non the MenuItem view, which adds the `state_activated` state to all the drawables in the\nMenuItem's views. This drawable state can be responded to with a drawable selector in the runtime\nresource overlay (RRO).\n\n`MenuItems` can be *UX restricted* when the vehicle is moving. UX restricted is\njust another drawable state like *activated* , but this time the state is defined in the app\ninstead of the Android framework. This means the `state_ux_restricted` attribute must\nalso be overlaid with the RRO, so that the attribute defined in the RRO matches the attribute\ndefined in the app.\n\nSearch\n------\n\nThe search bar is contained in a separate `car_ui_toolbar_search_view` layout file, in order to improve layout inflation performance for apps that don't need a search bar. The `FrameLayout` with id `car_ui_toolbar_search_view_container` will contain the search bar when it is inflated."]]