Karolarda dinamik güncellemeleri göster

Kutular 1.2'den itibaren dinamik ifadeleri kullanarak platform veri güncellemelerini aktarabilirsiniz. Ardından bu güncellemeleri kartlarınızdaki animasyonlarla ilişkilendirebilirsiniz. Uygulamanız bu değerle ilgili güncellemeleri saniyede bir alır.

Dinamik ifadeleri kullanarak, içeriği değişen karonun tamamını yenilemeniz gerekmez. Kartlarınızda daha ilgi çekici bir deneyim oluşturmak için bu dinamik nesneleri canlandırın.

Dinamik ifadeleri veri kaynaklarıyla ilişkilendirme

androidx.wear.protolayout ve androidx.wear.protolayout.material ad alanlarında, alanları dinamik ifadeleri kabul eden birçok sınıf bulunur. Aşağıda bu tür içeriklere örnek olarak verilecek birkaç içerik türü verilmiştir:

Kartınızdaki bir öğenin olası değeri olarak dinamik ifade kullanmak için öğenin ilgili *Prop dinamik mülk türünü kullanın ve veri kaynağını dinamik mülk türünün oluşturucu sınıfının setDynamicValue() yöntemine iletin.

Kutular aşağıdaki dinamik mülk türlerini destekler:

Fiziksel boyutları (bir karodaki renk hariç tüm değerler) etkileyen dinamik bir ifade kullandığınızda, dize biçimi gibi bir dizi ilgili kısıtlamayı da belirtmeniz gerekir. Bu kısıtlamalar, sistem oluşturucunun bir değerin karonuzda kaplayabildiği maksimum alan miktarını belirlemesine olanak tanır. Genellikle, setLayoutConstraintsForDynamic* ile başlayan bir yöntem çağırarak bu kısıtlamaları dinamik ifade düzeyinde değil, öğe düzeyinde belirtirsiniz.

Aşağıdaki kod snippet'inde, kalp atış hızı güncellemelerinin -- yedek değeriyle birlikte 3 basamak kullanılarak nasıl gösterileceği gösterilmektedir:

override fun onTileRequest(requestParams: RequestBuilders.TileRequest) =
    Futures.immediateFuture(
        Tile.Builder()
            .setResourcesVersion(RESOURCES_VERSION)
            .setFreshnessIntervalMillis(60 * 60 * 1000) // 60 minutes
            .setTileTimeline(
                Timeline.fromLayoutElement(
                    Text.Builder(
                        this,
                        TypeBuilders.StringProp.Builder("--")
                            .setDynamicValue(
                                PlatformHealthSources.heartRateBpm()
                                    .format()
                                    .concat(DynamicBuilders.DynamicString.constant(" bpm"))
                            )
                            .build(),
                        TypeBuilders.StringLayoutConstraint.Builder("000").build(),
                    )
                        .build()
                )
            )
            .build()
    )

Tek bir karoda az sayıda ifade kullanın

Wear OS, tek bir kartın sahip olabileceği ifade sayısına sınırlama getirir. Bir karo toplamda çok fazla dinamik ifade içeriyorsa dinamik değerler yoksayılır ve sistem, ilgili dinamik mülk türlerine sağladığınız statik değerlere geri döner.

Dinamik verileri bir durum nesnesine birleştirme

Veri kaynaklarından gelen en son güncelleme grubunu bir durum olarak birleştirebilir ve değer oluşturma için karonuza iletebilirsiniz.

Kartlarınızda eyalet bilgilerini kullanmak için aşağıdaki adımları uygulayın:

  1. Kartınızın durumunun farklı değerlerini temsil eden bir anahtar grubu oluşturun. Bu örnekte, su tüketimi ve bir not için anahtarlar oluşturulur:

    Kotlin

    companion object {
        val KEY_WATER_INTAKE = AppDataKey<DynamicInt32>("water_intake")
        val KEY_NOTE = AppDataKey<DynamicString>("note")
    }

    Java

    private static final AppDataKey<DynamicInt32> KEY_WATER_INTAKE =
        new AppDataKey<DynamicInt32>("water_intake");
    private static final AppDataKey<DynamicString> KEY_NOTE =
        new AppDataKey<DynamicString>("note");
  2. onTileRequest() uygulamanızda setState()'u çağırın ve her anahtardan belirli bir dinamik veri değerine yönelik ilk eşlemeleri oluşturun:

    Kotlin

    override fun onTileRequest(requestParams: TileRequest):
            ListenableFuture<Tile> {
        val state = State.Builder()
            .addKeyToValueMapping(KEY_WATER_INTAKE,
                DynamicDataBuilders.DynamicDataValue.fromInt(200))
            .addKeyToValueMapping(KEY_NOTE,
                DynamicDataBuilders.DynamicDataValue.fromString("Note about day"))
        .build()
        // ...
    
        return Futures.immediateFuture(Tile.Builder()
            // Set resources, timeline, and other tile properties.
            .setState(state)
            .build()
        )

    Java

    @Override
    protected ListenableFuture<Tile> onTileRequest(
                ListenableFuture<Tile> {
        State state = new State.Builder()
            .addKeyToValueMapping(KEY_WATER_INTAKE,
                DynamicDataBuilders.DynamicDataValue.fromInt(200))
            .addKeyToValueMapping(KEY_NOTE,
                DynamicDataBuilders.DynamicDataValue.fromString("Note about day"))
        .build();
        // ...
    
        return Futures.immediateFuture(Tile.Builder()
            // Set resources, timeline, and other tile properties.
            .setState(state)
            .build()
        );
    }
  3. Eyaletten alınan bu verileri göstermek istediğiniz bir yerde düzeninizi oluştururken Dynamic* türü bir nesne kullanın. Önceki değerden mevcut değere animasyon göstermek için animate() işlevini de çağırabilirsiniz:

    Kotlin

    DynamicInt32.from(KEY_WATER_INTAKE).animate()

    Java

    DynamicInt32.from(KEY_WATER_INTAKE).animate();
  4. Gerekirse durumu yeni değerlerle de güncelleyebilirsiniz. Bu, kartın LoadAction parçası olabilir.

    Bu örnekte, su tüketimi değeri 400 olarak güncellenmiştir:

    Kotlin

    val loadAction = LoadAction.Builder()
        .setRequestState(
            State.Builder()
                .addKeyToValueMapping(
                    KEY_WATER_INTAKE,
                    DynamicDataBuilders.DynamicDataValue.fromInt(400)
                )
                .build()
        )
        .build()

    Java

    LoadAction loadAction = new LoadAction.Builder()
        .setRequestState(
            new State.Builder()
                .addKeyToValueMapping(
                    KEY_WATER_INTAKE,
                    DynamicDataBuilders.DynamicDataValue.fromInt(400)
                ).build()
        ).build();