카드와 상호작용

레이아웃 요소에 Clickable 수정자를 추가하면 그 레이아웃 요소를 탭하는 사용자에게 반응할 수 있습니다. 클릭 이벤트 관련 반응으로 다음 두 가지 작업을 할 수 있습니다.

  • LaunchAction: AndroidManifest.xmlandroid:exported="true"라고 명시적으로 선언된 활동을 실행합니다.
  • LoadAction: onTileRequest()를 호출하여 카드를 강제로 새로고침합니다.

LaunchAction을 설정하려면 다음 코드 샘플과 같이 사용자가 요소를 탭했을 때 실행할 활동의 클래스 이름과 패키지 이름을 전달합니다.

Kotlin

private fun tappableElement(): LayoutElement =
    Text.Builder()
        .setText("Tap me!")
        .setModifiers(Modifiers.Builder()
            .setClickable(Clickable.Builder()
                .setId("foo")
                .setOnClick(LaunchAction.Builder()
                    .setAndroidActivity(AndroidActivity.Builder()
                        .setClassName(MyActivity::class.java.getName())
                        .setPackageName(this.packageName)
                        .build()
                    ).build()
                ).build()
            ).build()
        ).build()

자바

private LayoutElement tappableElement() {
    return new Text.Builder()
        .setText("Tap me!")
        .setModifiers(new Modifiers.Builder()
            .setClickable(new Clickable.Builder()
                .setId("foo")
                .setOnClick(new LaunchAction.Builder()
                    .setAndroidActivity(new AndroidActivity.Builder()
                        .setClassName(MyActivity.class.getName())
                        .setPackageName(this.getPackageName())
                        .build()
                    ).build()
                ).build()
            ).build()
        ).build();
}

다음 예에서와 같이 실행된 활동 내에서 카드에 사용된 ID를 가져올 수 있습니다.

Kotlin

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
    }
}

자바

public class MyActivity extends FragmentActivity {
   @Override
   public void onCreate(@Nullable Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       String clickableId =
           getIntent().getStringExtra(TileService.EXTRA_CLICKABLE_ID);
       // clickableId will be "foo" when launched from the Tile
   }
}

또는 다음 코드 샘플과 같이 사용자가 레이아웃 요소를 탭했을 때 LoadAction을 사용하여 카드를 새로고침합니다.

Kotlin

private fun tappableElement(): LayoutElement =
    Text.Builder()
        .setText("Tap me!")
        .setModifiers(Modifiers.Builder()
            .setClickable(Clickable.Builder()
                .setId("foo")
                .setOnClick(LoadAction.Builder().build())
                .build()
            ).build()
        ).build()

자바

private LayoutElement tappableElement() {
    return new Text.Builder()
        .setText("Tap me!")
        .setModifiers(new Modifiers.Builder()
            .setClickable(new Clickable.Builder()
                .setId("foo")
                .setOnClick(new LoadAction.Builder().build())
                .build()
            ).build()
        ).build()
}

여기서는 setId()에 설정된 클릭 가능한 ID가 onTileRequest() 호출에 전달되므로 다음 코드 샘플과 같이 이 ID를 기반으로 다른 레이아웃을 렌더링할 수 있습니다.

Kotlin

override fun onTileRequest(requestParams: TileRequest) = Futures.immediateFuture(
    Tile.Builder()
        .setResourcesVersion("1")
        .setTimeline(Timeline.Builder()
            .addTimelineEntry(TimelineEntry.Builder()
                .setLayout(Layout.Builder()
                    .setRoot(
                        when(requestParams.state.lastClickableId) {
                            "foo" -> myFooLayout()
                            else -> myOtherLayout()
                        }
                    ).build()
                ).build()
            ).build()
        ).build()
)

자바

@NonNull
@Override
protected ListenableFuture<Tile> onTileRequest(
   @NonNull TileRequest requestParams
) {
    LayoutElement root;
    if(requestParams.getState().getLastClickableId().equals("foo")) {
        root = myFooLayout();
    } else {
        root = myOtherLayout();
    }
    return Futures.immediateFuture(new Tile.Builder()
        .setResourcesVersion("1")
        .setTimeline(new Timeline.Builder()
            .addTimelineEntry(TimelineEntry.Builder()
                .setLayout(Layout.Builder()
                    .setRoot(root)
                    .build()
                ).build()
            ).build()
        ).build());
}