간단한 위젯 만들기

앱 위젯은 다른 앱에 삽입할 수 있는 소형 앱 뷰입니다. 앱(예: 홈 화면)에 액세스하고 주기적인 업데이트를 받을 수 있습니다. 이러한 뷰는 사용자 인터페이스에서 위젯이라고 하며 앱 위젯 제공자 (또는 위젯 제공자)를 사용합니다. 앱 구성요소는 다른 위젯을 보유하는 것을 앱 위젯 호스트 (또는 위젯 호스트)라고 합니다. 그림 1 샘플 음악 위젯을 보여줍니다.

음악 위젯의 예
그림 1. 음악 위젯의 예

이 문서에서는 위젯 제공자를 사용하여 위젯을 게시하는 방법을 설명합니다. 대상 AppWidgetHost 만들기에 대한 세부정보 및 호스트 앱 위젯에 관해 자세히 알아보려면 위젯 호스트 빌드를 참고하세요.

위젯을 디자인하는 방법에 관한 자세한 내용은 앱 위젯 개요를 참고하세요.

위젯 구성요소

위젯을 만들려면 다음과 같은 기본 구성요소가 필요합니다.

AppWidgetProviderInfo 객체
위젯의 레이아웃, 업데이트 등 위젯의 메타데이터를 설명합니다. 빈도, AppWidgetProvider 클래스 등이 있습니다. AppWidgetProviderInfo은 다음과 같이 XML로 정의됩니다. 이 문서에 설명되어 있습니다.
AppWidgetProvider 클래스
위젯에 추가합니다. 이를 통해 위젯이 업데이트될 때 브로드캐스트를 수신하여 사용, 사용 중지 또는 삭제됨 AppWidgetProvider를 선언하여 매니페스트를 작성하고 구현합니다. 이 문서에 설명되어 있습니다.
레이아웃 보기
위젯의 초기 레이아웃을 정의합니다. 레이아웃은 XML을 사용해야 합니다.

그림 2는 이러한 구성요소가 전반적인 앱 위젯 처리에 어떻게 적용되는지 보여줍니다. 있습니다.

앱 위젯 처리 흐름
그림 2. 앱 위젯 처리 흐름
를 통해 개인정보처리방침을 정의할 수 있습니다.

위젯에 사용자 구성이 필요한 경우 앱 위젯 구성 구현 있습니다. 이 활동을 통해 사용자는 위젯 설정(예: 표준시간대를 설정할 수 있습니다.

또한 유연한 위젯 레이아웃, 기타 개선사항, 고급 위젯, 컬렉션 위젯, 위젯 빌드와 같은 개선사항을 권장합니다. 호스트를 선택합니다.

AppWidgetProviderInfo XML 선언

AppWidgetProviderInfo 객체는 위젯의 필수 특성을 정의합니다. 단일를 사용하여 XML 리소스 파일에서 AppWidgetProviderInfo 객체를 정의합니다. <appwidget-provider> 요소를 만들고 프로젝트의 res/xml/ 폴더에 저장합니다.

예를 들면 다음과 같습니다.

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="40dp"
    android:minHeight="40dp"
    android:targetCellWidth="1"
    android:targetCellHeight="1"
    android:maxResizeWidth="250dp"
    android:maxResizeHeight="120dp"
    android:updatePeriodMillis="86400000"
    android:description="@string/example_appwidget_description"
    android:previewLayout="@layout/example_appwidget_preview"
    android:initialLayout="@layout/example_loading_appwidget"
    android:configure="com.example.android.ExampleAppWidgetConfigurationActivity"
    android:resizeMode="horizontal|vertical"
    android:widgetCategory="home_screen"
    android:widgetFeatures="reconfigurable|configuration_optional">
</appwidget-provider>

위젯 크기 조정 속성

기본 홈 화면은 셀 그리드를 기반으로 창에 위젯을 배치합니다. 광고를 게재할 수 있습니다. 대부분의 홈 화면에서는 위젯이 그리드 셀의 정수배인 크기(예: 2개의 셀) 가로로 3개 셀을 세로로 배열할 수 있습니다.

위젯 크기 조절 속성을 사용하면 위젯의 기본 크기를 지정하고 위젯 크기에 대한 하한 및 상한을 제공합니다. 이러한 맥락에서 위젯의 기본 크기는 위젯이 처음 실행될 때 차지하는 크기입니다. 홈 화면에 추가되었습니다.

다음 표는 <appwidget-provider> 다음과 같습니다.

속성 및 설명
targetCellWidthtargetCellHeight (Android 12), minWidthminHeight
  • Android 12부터 targetCellWidthtargetCellHeight 속성은 그리드 측면에서 위젯의 기본 크기를 지정합니다. 셀입니다. 다음 속성은 Android 11에서 무시됨 이보다 낮을 수 있으며 홈 화면이 더 큰 화면에 표시되지 않으면 무시할 수 있습니다. 그리드 기반 레이아웃을 지원해야 합니다.
  • minWidthminHeight 속성은 위젯의 기본 크기를 지정합니다. dp 단위로 설정합니다. 위젯의 최소 너비 또는 높이 값이 일치하지 않는 경우 값이 셀의 치수만큼 반올림되므로 가장 가까운 셀 크기입니다.
를 통해 개인정보처리방침을 정의할 수 있습니다. 두 집합 모두 지정하는 것이 좋습니다. 속성: targetCellWidthtargetCellHeight, minWidthminHeight: 앱이 사용자의 기기가 minWidthminHeight인 경우 targetCellWidthtargetCellHeight입니다. 지원되는 경우 targetCellWidthtargetCellHeight 속성 minWidthminHeight보다 우선합니다. 속성
minResizeWidthminResizeHeight 위젯의 절대 최소 크기를 지정합니다. 이러한 값은 이 크기보다 작아야 위젯을 읽을 수 없거나 사용할 수 없습니다. 사용 이러한 속성을 사용하면 사용자가 위젯의 크기를 더 작은 크기로 조정할 수 있습니다. 더 크게 설정할 수 있습니다. minResizeWidth 속성: minWidth보다 크거나 가로이면 무시됩니다. 크기 조절이 사용 설정되지 않았습니다. 자세한 내용은 resizeMode 마찬가지로 다음보다 크면 minResizeHeight 속성이 무시됩니다. minHeight 또는 세로 크기 조절이 사용 설정되지 않은 경우.
maxResizeWidthmaxResizeHeight 위젯의 권장 최대 크기를 지정합니다. 값이 그리드 셀 크기의 배수인 경우 가장 가까운 셀 크기로 반올림됩니다. 셀 크기입니다. 다음과 같은 경우 maxResizeWidth 속성은 무시됩니다. minWidth보다 작거나 가로 크기 조절이 사용 설정되어 있습니다. resizeMode를 참고하세요. 마찬가지로 maxResizeHeight 속성이 더 큰 경우 무시됩니다. minHeight보다 작거나 세로 크기 조절이 사용 설정되지 않은 경우입니다. Android 12에서 도입되었습니다.
resizeMode 위젯의 크기를 조절할 수 있는 규칙을 지정합니다. 이 속성을 사용하여 홈 화면 위젯의 크기를 또는 두 축 모두에서 작업할 수 있습니다. 사용자가 터치 & 위젯을 길게 눌러 크기 조절 핸들을 표시하고 그런 다음 가로 또는 세로 핸들을 드래그하여 레이아웃 그리드 resizeMode 속성 값에는 다음이 포함됩니다. horizontal, vertical, none 받는사람 위젯의 크기를 가로와 세로로 조절할 수 있다고 선언하고, horizontal|vertical

위 표의 속성이 위젯 크기 조정에 미치는 영향을 설명하기 위해 다음 사양을 가정합니다.

  • 그리드 셀은 너비 30dp, 높이 50dp입니다.
  • 다음과 같은 속성 사양이 제공됩니다.
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="80dp"
    android:minHeight="80dp"
    android:targetCellWidth="2"
    android:targetCellHeight="2"
    android:minResizeWidth="40dp"
    android:minResizeHeight="40dp"
    android:maxResizeWidth="120dp"
    android:maxResizeHeight="120dp"
    android:resizeMode="horizontal|vertical" />

Android 12부터:

targetCellWidthtargetCellHeight 속성을 기본값으로 사용 지정할 수 있습니다.

위젯의 크기는 기본적으로 2x2입니다. 위젯의 크기는 2x1 또는 최대 4x3입니다.

Android 11 이하:

minWidthminHeight 속성을 사용하여 있습니다.

기본 너비 = Math.ceil(80 / 30) = 3

기본 높이 = Math.ceil(80 / 50) = 2

위젯의 크기는 기본적으로 3x2입니다. 위젯의 크기는 2x1 또는 전체 화면으로 전환할 수 있습니다

추가 위젯 속성

다음 표는 <appwidget-provider> 품질에 차이가 있습니다.

속성 및 설명
updatePeriodMillis 위젯 프레임워크가 onUpdate()를 호출하여 AppWidgetProvider 콜백 메서드를 호출합니다. 실제 업데이트는 다음 위치에서 정확히 발생하지 않을 수도 있습니다. 업데이트하며 최대한 자주 업데이트하지 않는 것이 좋습니다. 하여 배터리를 보존합니다. 적절한 업데이트 기간을 선택하기 위한 고려사항의 전체 목록은 보기 위젯 업데이트를 위한 최적화 콘텐츠를 참조하세요.
initialLayout 위젯 레이아웃을 정의하는 레이아웃 리소스를 가리킵니다.
configure 사용자가 위젯을 추가할 때 실행되는 활동을 정의합니다. 위젯 속성을 구성할 수 있습니다. 자세한 내용은 사용자가 위젯을 구성할 수 있도록 사용 설정합니다. Android 12부터 앱에서 초기 구성할 수 있습니다 자세한 내용은 위젯의 기본 구성을 참조하세요.
description 표시할 위젯 선택 도구에 대한 설명을 위젯에 추가합니다. Android 12에서 도입되었습니다.
previewLayout (Android 12) 및 previewImage (Android 11 이하)
  • Android 12부터 previewLayout 속성은 확장 가능한 미리보기를 지정합니다. 위젯의 기본 크기로 설정된 XML 레이아웃으로 제공합니다. 이상적으로는 이 속성으로 지정된 레이아웃 XML은 위젯을 만듭니다.
  • Android 11 이하에서 previewImage 속성은 위젯이 실행된 후 위젯이 어떻게 보일지 미리 구성되며 사용자가 앱 위젯을 선택할 때 표시됩니다. 그렇지 않은 경우 앱의 런처 아이콘이 대신 표시됩니다. 이 필드는 android:previewImage 속성에 해당합니다. <receiver> 요소 AndroidManifest.xml 파일
를 통해 개인정보처리방침을 정의할 수 있습니다. 참고: previewImagepreviewLayout 속성을 사용하여 앱이 사용자의 기기에서 지원되지 않는 경우 previewImage 사용 previewLayout입니다. 자세한 내용은 확장 가능한 버전과의 하위 호환성 위젯 미리보기를 참조하세요.
autoAdvanceViewId 자동으로 진행되는 위젯 하위 뷰의 뷰 ID를 지정합니다. 삭제할 수 있습니다.
widgetCategory 위젯을 홈 화면에 표시할 수 있는지 여부를 선언합니다. (home_screen), 잠금 화면 (keyguard) 또는 있습니다 Android 5.0 이상에서는 home_screen만 유효합니다.
widgetFeatures 위젯에서 지원하는 기능을 선언합니다. 예를 들어 사용자가 위젯을 추가할 때 위젯의 기본 구성을 사용하고, 둘 다 configuration_optional 드림 및 reconfigurable 있습니다. 이렇게 하면 사용자 실행 후 구성 활동 실행을 우회합니다. 위젯을 추가합니다. 사용자는 여전히 재구성하려면 있습니다.

AppWidgetProvider 클래스를 사용하여 위젯 브로드캐스트 처리

AppWidgetProvider 클래스는 위젯 브로드캐스트를 처리하고 위젯을 업데이트합니다. 자동 확장 기능을 사용할 수 있습니다. 다음 섹션에서는 매니페스트에서 AppWidgetProvider을 선언하고 구현합니다.

매니페스트에서 위젯 선언

먼저 앱의 AndroidManifest.xml에서 AppWidgetProvider 클래스를 선언합니다. 파일을 생성합니다.

<receiver android:name="ExampleAppWidgetProvider"
                 android:exported="false">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data android:name="android.appwidget.provider"
               android:resource="@xml/example_appwidget_info" />
</receiver>

<receiver> 요소에는 android:name 속성이 필요하며, 이 속성은 위젯에서 사용하는 AppWidgetProvider입니다. 이 구성요소는 내보낼 수 없습니다. 별도의 프로세스에서 AppWidgetProvider에 브로드캐스트해야 하는 경우가 아니라면 다음과 같습니다. 그렇지 않습니다.

<intent-filter> 요소는 <action> 요소를 포함해야 하며 android:name 속성 이 속성은 AppWidgetProvider 수락합니다. ACTION_APPWIDGET_UPDATE 있습니다. 이 브로드캐스트만 명시적으로 선언하면 됩니다. 이 AppWidgetManager 드림 다른 모든 위젯 브로드캐스트를 AppWidgetProvider에 자동으로 전송합니다. 있습니다.

<meta-data> 요소는 AppWidgetProviderInfo 리소스를 지정하고 에는 다음 속성이 필요합니다.

  • android:name: 메타데이터 이름을 지정합니다. 사용 android.appwidget.provider: 데이터를 AppWidgetProviderInfo 설명어입니다.
  • android:resource: AppWidgetProviderInfo 리소스를 지정합니다. 볼 수 있습니다

AppWidgetProvider 클래스 구현

AppWidgetProvider 클래스는 BroadcastReceiver, 편의 클래스를 사용하여 위젯 브로드캐스트를 처리합니다. 이벤트만 수신합니다. 위젯이 업데이트될 때와 같이 위젯과 관련된 브로드캐스트를 사용 중지, 삭제, 사용 설정, 사용할 수 없습니다. 이러한 브로드캐스트 이벤트가 발생하면 AppWidgetProvider 메서드는 다음과 같이 호출됩니다.

onUpdate()
이 메서드는 정의된 간격으로 위젯을 업데이트하기 위해 호출됩니다. AppWidgetProviderInfoupdatePeriodMillis 속성 표 참조 추가 위젯 속성 설명을 참조하세요. 자세히 알아보세요.
를 통해 개인정보처리방침을 정의할 수 있습니다.
이 메서드는 사용자가 위젯을 추가할 때도 호출되므로 이벤트 핸들러 정의와 같은 필수 설정 View 객체 또는 데이터를 로드할 작업 시작 표시됩니다. 그러나 구성 활동을 선언하지 않고 configuration_optional 플래그의 경우, 이 메서드는 사용자가 위젯이 추가되지만 후속 업데이트 시 호출됩니다. 이것이 바로 첫 번째 업데이트를 수행하도록 구성 활동의 책임을 져야 합니다. 구성이 완료됩니다 자세한 내용은 사용자가 앱 위젯을 구성하도록 사용 설정을 참고하세요.
를 통해 개인정보처리방침을 정의할 수 있습니다.
가장 중요한 콜백은 onUpdate()입니다. onUpdate() 클래스를 참조하세요.
onAppWidgetOptionsChanged()

위젯이 처음 배치될 때와 위젯이 배치될 때마다 호출됩니다. 크기를 조정합니다. 이 콜백을 사용하여 위젯의 크기에 따라 콘텐츠를 표시하거나 숨깁니다. 확인할 수 있습니다 크기 범위를 가져옵니다. Android 12부터는 다음을 호출하여 위젯 인스턴스가 취할 수 있는 가능한 크기의 목록입니다. getAppWidgetOptions()님, 이는 다음을 포함하는 Bundle를 반환합니다. 있습니다.

onDeleted(Context, int[])

위젯 호스트에서 위젯이 삭제될 때마다 호출됩니다.

onEnabled(Context)

위젯의 인스턴스가 처음 생성될 때 호출됩니다. 예를 들어 사용자가 위젯의 인스턴스를 두 개 추가하는 경우 확인할 수 있습니다 새 데이터베이스를 열거나 모든 위젯 인스턴스에 대해 한 번만 발생하면 되는 경우 하세요.

onDisabled(Context)

위젯의 마지막 인스턴스가 위젯 호스트가 있습니다. 여기에서 onEnabled(Context)에서 실행한 모든 작업을 삭제합니다. 임시 데이터베이스 삭제와 같은 작업을 예로 들 수 있습니다

onReceive(Context, Intent)

모든 브로드캐스트와 이전의 각 콜백 전에 호출됩니다. 메서드를 참조하세요. 일반적으로 이 메서드는 구현하지 않아도 됩니다. 기본값이 AppWidgetProvider 구현은 모든 위젯 브로드캐스트를 필터링하고 적절한 이전 메서드를 사용해야 합니다.

AppWidgetProvider 클래스 구현을 브로드캐스트로 선언해야 합니다. 수신자는 AndroidManifest<receiver> 요소를 사용하여 수신해야 합니다. 자세한 내용은 이 페이지의 매니페스트에 있는 매니페스트의 위젯을 참고하세요.

onUpdate() 클래스로 이벤트 처리

가장 중요한 AppWidgetProvider 콜백은 onUpdate()입니다. 각 위젯이 호스트에 추가될 때 호출됩니다. 단, 구성을 사용하지 않는 한 활동을 configuration_optional 플래그 없이 실행합니다. 위젯이 이벤트를 수신하고 이벤트가 발생하면 이 콜백에 이벤트 핸들러를 등록합니다. 만약 위젯이 임시 파일이나 데이터베이스를 만들거나 다른 작업을 수행하지 않음 정리가 필요한 경우 onUpdate()가 유일한 콜백 메서드일 수 있습니다. 정의할 수 있습니다

예를 들어, 활동 중일 때 활동을 시작하는 버튼이 있는 위젯을 원하는 경우 다음과 같은 AppWidgetProvider 구현을 사용할 수 있습니다.

Kotlin

class ExampleAppWidgetProvider : AppWidgetProvider() {

    override fun onUpdate(
            context: Context,
            appWidgetManager: AppWidgetManager,
            appWidgetIds: IntArray
    ) {
        // Perform this loop procedure for each widget that belongs to this
        // provider.
        appWidgetIds.forEach { appWidgetId ->
            // Create an Intent to launch ExampleActivity.
            val pendingIntent: PendingIntent = PendingIntent.getActivity(
                    /* context = */ context,
                    /* requestCode = */  0,
                    /* intent = */ Intent(context, ExampleActivity::class.java),
                    /* flags = */ PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
            )

            // Get the layout for the widget and attach an onClick listener to
            // the button.
            val views: RemoteViews = RemoteViews(
                    context.packageName,
                    R.layout.appwidget_provider_layout
            ).apply {
                setOnClickPendingIntent(R.id.button, pendingIntent)
            }

            // Tell the AppWidgetManager to perform an update on the current
            // widget.
            appWidgetManager.updateAppWidget(appWidgetId, views)
        }
    }
}

자바

public class ExampleAppWidgetProvider extends AppWidgetProvider {

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        // Perform this loop procedure for each widget that belongs to this
        // provider.
        for (int i=0; i < appWidgetIds.length; i++) {
            int appWidgetId = appWidgetIds[i];
            // Create an Intent to launch ExampleActivity
            Intent intent = new Intent(context, ExampleActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(
                /* context = */ context,
                /* requestCode = */ 0,
                /* intent = */ intent,
                /* flags = */ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE
            );

            // Get the layout for the widget and attach an onClick listener to
            // the button.
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.example_appwidget_layout);
            views.setOnClickPendingIntent(R.id.button, pendingIntent);

            // Tell the AppWidgetManager to perform an update on the current app
            // widget.
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    }
}

AppWidgetProvideronUpdate() 메서드만 정의하며 이를 사용하여 다음을 수행합니다. PendingIntent 만들기 Activity를 호출하여 위젯의 setOnClickPendingIntent(int, PendingIntent)를 사용하여 버튼을 탭합니다. 각 항목을 통해 반복되는 루프를 포함합니다. appWidgetIds: 이 제공업체 사용자가 위젯 인스턴스를 두 개 이상 만드는 경우 모두 동시에 업데이트됩니다 하지만 updatePeriodMillis 일정이 하나만 있습니다. 가 관리됩니다. 예를 들어 업데이트 일정이 2시간마다로 정의되며 위젯의 두 번째 인스턴스가 첫 번째 호출 후 1시간이 지나면 둘 다 다음과 같이 정의된 기간에 업데이트됩니다. 두 번째 업데이트 기간은 무시됩니다. 둘 다 매시간이 아니라 매시간입니다.

자세한 내용은 ExampleAppWidgetProvider.java 드림 샘플 클래스를 참조하세요.

위젯 브로드캐스트 인텐트 수신

AppWidgetProvider는 편의 클래스입니다. 위젯을 받으려는 경우 직접 브로드캐스트하는 경우 자체 BroadcastReceiver를 구현하거나 onReceive(Context,Intent) 콜백입니다. 관심을 가져야 할 인텐트는 있습니다.

위젯 레이아웃 만들기

위젯의 초기 레이아웃을 XML로 정의하고 프로젝트의 res/layout/ 디렉터리에 있습니다. 자세한 내용은 설계 가이드라인을 참조하세요.

위젯 레이아웃에 익숙하다면 간단하게 만들 수 있습니다. 레이아웃 하지만 위젯은 RemoteViews를 기반으로 합니다. 이는 모든 종류의 레이아웃 또는 뷰 위젯을 지원하지는 않습니다. 맞춤 인벤토리는 RemoteViews에서 지원하는 뷰의 뷰 또는 서브클래스.

RemoteViewsViewStub도 지원합니다. 크기가 0인 보이지 않는 View이며, 레이아웃을 느리게 확장하는 데 사용할 수 있습니다. 리소스를 배포합니다

스테이트풀(Stateful) 동작 지원

Android 12에서는 다음을 사용하여 스테이트풀(Stateful) 동작 지원을 추가합니다. 기존 구성요소:

위젯은 여전히 스테이트리스(Stateless)입니다. 앱은 상태를 저장하고 상태 변경 이벤트에 등록해야 합니다.

스테이트풀(Stateful) 동작을 보여주는 쇼핑 목록 위젯의 예
그림 3. 스테이트풀(Stateful) 동작의 예
를 통해 개인정보처리방침을 정의할 수 있습니다.

다음 코드 예는 이러한 구성요소를 구현하는 방법을 보여줍니다.

Kotlin

// Check the view.
remoteView.setCompoundButtonChecked(R.id.my_checkbox, true)

// Check a radio group.
remoteView.setRadioGroupChecked(R.id.my_radio_group, R.id.radio_button_2)

// Listen for check changes. The intent has an extra with the key
// EXTRA_CHECKED that specifies the current checked state of the view.
remoteView.setOnCheckedChangeResponse(
        R.id.my_checkbox,
        RemoteViews.RemoteResponse.fromPendingIntent(onCheckedChangePendingIntent)
)

자바

// Check the view.
remoteView.setCompoundButtonChecked(R.id.my_checkbox, true);

// Check a radio group.
remoteView.setRadioGroupChecked(R.id.my_radio_group, R.id.radio_button_2);

// Listen for check changes. The intent has an extra with the key
// EXTRA_CHECKED that specifies the current checked state of the view.
remoteView.setOnCheckedChangeResponse(
    R.id.my_checkbox,
    RemoteViews.RemoteResponse.fromPendingIntent(onCheckedChangePendingIntent));

두 가지 레이아웃 제공: Android 12를 실행하는 기기를 타겟팅하는 레이아웃 res/layout-v31에서 더 높음, 다른 타겟팅은 이전에 나타났음 기본 res/layout 폴더에 있는 Android 11 이하

둥근 모서리 구현

Android 12에는 다음과 같은 시스템 매개변수가 도입되어 둥근 모서리의 반경을 반환합니다.

  • system_app_widget_background_radius: 위젯 배경의 모서리 반경으로, 다음보다 크지 않습니다. 28dp

  • system_app_widget_inner_radius: 위젯 내부의 모든 뷰의 모서리 반경을 정의합니다. 정확히 8dp입니다. 8dp를 사용할 때 깔끔하게 정렬되도록 배경 반경보다 작음 패딩.

다음 예는 위젯 모서리에 system_app_widget_background_radius를 사용하고 위젯 내부 뷰에 system_app_widget_inner_radius를 사용하는 위젯을 보여줍니다.

위젯 배경의 반경과 위젯 내부 뷰를 보여주는 위젯
그림 4. 둥근 모서리.

1 위젯의 모서리

2 위젯 내부의 뷰 모서리

둥근 모서리 관련 중요 고려사항

  • 서드 파티 런처와 기기 제조업체는 system_app_widget_background_radius 매개변수를 28dp 미만으로 설정합니다. system_app_widget_inner_radius 매개변수는 항상 다음 값보다 8dp 작습니다. system_app_widget_background_radius의 값입니다.
  • 위젯이 @android:id/background를 사용하지 않거나 배경을 정의하지 않는 경우 개요에 따라 콘텐츠를 자르는 android:clipToOutline true로 설정하면 런처가 자동으로 배경을 식별하고 최대 16dp의 둥근 모서리를 가진 직사각형을 사용하여 위젯을 자릅니다. 위젯이 Android 12

이전 버전의 Android와의 위젯 호환성을 위해 커스텀 속성 정의 및 커스텀 테마를 사용하여 Android 12(다음 샘플 XML 파일)

/values/attrs.xml

<resources>
  <attr name="backgroundRadius" format="dimension" />
</resources>

/values/styles.xml

<resources>
  <style name="MyWidgetTheme">
    <item name="backgroundRadius">@dimen/my_background_radius_dimen</item>
  </style>
</resources>

/values-31/styles.xml

<resources>
  <style name="MyWidgetTheme" parent="@android:style/Theme.DeviceDefault.DayNight">
    <item name="backgroundRadius">@android:dimen/system_app_widget_background_radius</item>
  </style>
</resources>

/drawable/my_widget_background.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="rectangle">
  <corners android:radius="?attr/backgroundRadius" />
  ...
</shape>

/layout/my_widget_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  ...
  android:background="@drawable/my_widget_background" />