카드를 대화형으로 만들면 카드 환경을 개선할 수 있습니다. 카드 내의 레이아웃 요소에 Clickable
수정자를 추가하면 그 레이아웃 요소를 탭하는 사용자에게 반응할 수 있습니다.
이 페이지에는 사용자가 대화형 카드 내에서 실행하는 몇 가지 일반적인 작업과 앱 카드에서 이 동작을 구현하는 방법을 안내합니다.
새 카드 레이아웃 로드
LoadAction
을 사용하여 사용자가 대화형 요소를 탭했을 때 카드의 레이아웃을 새로고침합니다.
다음 코드 스니펫에서는 setId()
에 설정된 클릭 가능한 ID가 onTileRequest()
호출에 전달되므로 이 ID를 기반으로 다른 레이아웃을 렌더링할 수 있습니다.
override fun onTileRequest(requestParams: TileRequest) = Futures.immediateFuture(
Tile.Builder()
.setResourcesVersion("1")
.setTileTimeline(Timeline.fromLayoutElement(
when(requestParams.currentState.lastClickableId) {
"foo" -> myFooLayout()
else -> myOtherLayout()
}
)).build()
)
카드 내에서 상태 업데이트
카드의 상호작용 요소에 여러 개의 가능한 상태가 있는 경우 LoadAction
을 사용하여 요소의 새 값을 표시합니다. 다음 코드 스니펫에서 카드가 체크박스의 업데이트된 값을 보여줍니다.
private fun checkboxChip(
checkboxValue: Boolean,
deviceParameters: DeviceParametersBuilders.DeviceParameters
): Chip =
Chip.Builder(
context,
Clickable.Builder()
.setOnClick(LoadAction.Builder()
.build()
).build(),
deviceParameters
).setIconContent(if (checkboxValue) "check" else "checkoff")
// Set checkbox labels and colors here.
.build()
카드 콘텐츠 새로고침 요청
카드의 전체 콘텐츠 업데이트를 요청하려면 다음 코드 스니펫과 같이 LoadAction
을 사용하여 카드의 요청 상태를 업데이트합니다.
private fun tappableElement(): LayoutElement =
Button.Builder(this, Clickable.Builder()
.setId("foo")
.setOnClick(LoadAction.Builder()
.setRequestState(
StateBuilders.State.Builder()
/* Update state information here. */
.build()
).build()
).build())
.setTextContent("Tap me!")
.build()
딥 링크를 사용하여 활동 로드
딥 링크를 사용하여 활동을 로드하려면 클릭 가능한 요소를 LoadAction
객체에 연결합니다.
private fun tappableElement(): LayoutElement =
Text.Builder()
.setText("Tap me!")
.setModifiers(Modifiers.Builder()
.setClickable(Clickable.Builder()
.setId("foo")
.setOnClick(LoadAction.Builder().build())
.build()
).build()
).build()
그런 다음 onTileRequest()
메서드에서 TaskStackBuilder
객체를 도우미로 사용합니다.
override fun onTileRequest(requestParams: TileRequest): ListenableFuture<TileBuilders.Tile> {
val lastClickableId = requestParams.currentState.lastClickableId
if (lastClickableId == "foo") {
TaskStackBuilder.create(this)
.addNextIntentWithParentStack(Intent(
Intent.ACTION_VIEW,
"https://www.example.com/$lastClickableId".toUri(),
context,
MyWearOsAppActivity::class.java
))
.startActivities()
}
// The user clicked somewhere else on the tile instead.
}
내보낸 활동 로드
내보낸 활동을 클래스 이름을 사용하여 추가 인텐트와 함께 로드하려면 LaunchAction
을 사용합니다.
private fun tappableElement(): LayoutElement =
Text.Builder(this, "Tap me!")
.setModifiers(Modifiers.Builder()
.setClickable(Clickable.Builder()
.setId("foo")
.setOnClick(ActionBuilders.launchAction(
ComponentName("my.package.name", "MyActivity")
)).build()
).build()
).build()
다음 예에서와 같이 실행된 활동 내에서 카드에 사용된 ID를 가져올 수 있습니다.
class MyActivity : FragmentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val clickableId =
intent.getStringExtra(TileService.EXTRA_CLICKABLE_ID)
// clickableId will be "foo" when launched from the Tile
}
}
추천 서비스
- 참고: JavaScript가 사용 중지되어 있으면 링크 텍스트가 표시됩니다.
- Wear OS에서 첫 카드 만들기
- ProtoLayout 네임스페이스로 이전
- 카드에 동적 업데이트 표시