如何向 EdgeContentLayout(图块)添加可点击修饰符

问题描述 投票:0回答:1

有什么问题

我正在尝试构建一个带有进度条(显示用户的睡眠时间)的图块,当用户单击它时,它会打开主活动(应用程序),但我不知道如何添加可点击修饰符到我的

EdgeContentLayout
,当我将可点击修饰符添加到我的文本中时,它甚至不会打开应用程序。

我的代码

这是我的

MainTileService

/**
 * Skeleton for a tile with no images.
 */
@OptIn(ExperimentalHorologistApi::class)
class MainTileService : SuspendingTileService() {
    override suspend fun resourcesRequest(
        requestParams: RequestBuilders.ResourcesRequest
    ): ResourceBuilders.Resources {
        return ResourceBuilders.Resources.Builder()
            .setVersion(RESOURCES_VERSION)
            .addIdToImageMapping(
                "sleep_icon",
                ResourceBuilders.ImageResource.Builder()
                    .setAndroidResourceByResId(
                        ResourceBuilders.AndroidImageResourceByResId.Builder()
                        .setResourceId(R.drawable.sleep)
                        .build()
                    ).build()
            ).build()
    }

    override suspend fun tileRequest(
        requestParams: RequestBuilders.TileRequest
    ): TileBuilders.Tile {
        val lastClickableId = requestParams.currentState.lastClickableId
        if (lastClickableId === LAUNCH_APP_ID) {
            Log.d("Tile", "Launching main activity...")
            startActivity(packageManager.getLaunchIntentForPackage(packageName))
        }
        
        val sharedPreferences = getSharedPreferences(
            SettingsBasics.SHARED_PREFERENCES.getKey(),
            SettingsBasics.SHARED_PREFERENCES.getMode()
        )
        // Initialize managers
        val timeManager = TimeManager()
        val alarmManager = AlarmsManager()
        // Get preferences
        val useAlarm = sharedPreferences.getBoolean(Settings.ALARM.getKey(), Settings.ALARM.getDefaultAsBoolean())
        val wakeTimeString = sharedPreferences.getString(Settings.WAKE_TIME.getKey(), Settings.WAKE_TIME.getDefault())
        // Get next alarm
        val nextAlarm = alarmManager.fetchAlarms(this);
        // Calculate wake time
        // between alarm and wake time
        val wakeTime = timeManager.getWakeTime(
            useAlarm,
            nextAlarm,
            wakeTimeString,
            Settings.WAKE_TIME.getDefaultAsLocalTime()
        );
        // Calculate time difference
        val sleepTime = timeManager.calculateTimeDifference(wakeTime.first)
        // Calculate sleep quality from time diff
        val sleepQuality = timeManager.calculateSleepQuality(sleepTime)

        val singleTileTimeline = TimelineBuilders.Timeline.Builder().addTimelineEntry(
            TimelineBuilders.TimelineEntry.Builder().setLayout(
                LayoutElementBuilders.Layout.Builder().setRoot(
                    tileLayout(this, sleepTime, sleepQuality).build()
                ).build()
            ).build()
        ).build()


        return TileBuilders.Tile.Builder()
            .setResourcesVersion(RESOURCES_VERSION)
            .setTileTimeline(singleTileTimeline)
            .setFreshnessIntervalMillis(
                // Every 5 minutes (60000 = 1m)
                60000 * 5
            )
            .build()
    }
}

这是我的图块布局:

private fun tileLayout(
    context: Context,
    sleepTime: TimeDifference,
    sleepQuality: SleepQuality
): EdgeContentLayout.Builder {
    val deviceParameters = buildDeviceParameters(context.resources)
    return EdgeContentLayout.Builder(deviceParameters)
        .setEdgeContent(
            CircularProgressIndicator.Builder()
                .setProgress(sleepTime.hours.toFloat() / DEFAULT_GOAL)
                .setStartAngle(-165f)
                .setEndAngle(165f)
                .setCircularProgressIndicatorColors(
                    ProgressIndicatorColors(
                        TileColors.PrimaryColor,
                        TileColors.TrackColor
                    )
                )
                .build()
        )
        .setPrimaryLabelTextContent(
            Text.Builder(context, "Sleep")
                .setTypography(6.toInt())
                .setColor(argb(TileColors.LightText))
                .build()
        )
        .setSecondaryLabelTextContent(
            Text.Builder(context, sleepQuality.getTitle())
                .setTypography(Typography.TYPOGRAPHY_CAPTION1)
                .setColor(argb(TileColors.White))
                .build()
        )
        .setContent(
            Spannable.Builder()
                .addSpan(
                    SpanText.Builder()
                        .setText(sleepTime.hours.toString())
                        .setFontStyle(
                            FontStyle.PrimaryFontSize.getBuilder()
                        )
                        .build()
                )
                .addSpan(
                    SpanText.Builder()
                        .setText("h")
                        .setFontStyle(
                            FontStyle.SecondaryFontSize.getBuilder()
                        )
                        .build()
                )
                .addSpan(
                    SpanText.Builder()
                        .setText(" ")
                        .build()
                )
                .addSpan(
                    SpanText.Builder()
                        .setText(sleepTime.minutes.toString())
                        .setFontStyle(
                            FontStyle.PrimaryFontSize.getBuilder()
                        )
                        .build()
                )
                .addSpan(
                    SpanText.Builder()
                        .setText("m")
                        .setFontStyle(
                            FontStyle.SecondaryFontSize.getBuilder()
                        )
                        .build()
                )
                .build()
        )
}

完整代码可在 github

获取

我尝试过的事情

  • 将图块布局包裹在
    LayoutElementBuilders.Box.Builder
    中,然后添加可点击修饰符,但这会使图块变为空白

我想要什么

我想要一个带有进度条的图块,当用户单击该图块时,它会启动主要活动(应用程序)

wear-os
1个回答
1
投票

您尝试过的这部分:

将图块布局包装在 LayoutElementBuilders.Box.Builder 中,然后添加可单击修饰符,但这会使图块变为空白

很好。您看到的是空白图块,因为 Box 默认情况下将宽度和高度设置为

wrap
,但
EdgeContentLayout
的尺寸是展开的(即,当将展开子项设置为换行的父项时,该元素将不会显示),要解决这个问题,您可以执行以下操作:

import androidx.wear.protolayout.DimensionBuilders.expand

Box.Builder()
  .setWidth(expand())
  .setHeight(expand())
  .addContent(yourEdgeContentLayout)
  .build()

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.