التفاعل مع الشاشات

يمكنك تحسين تجربة استخدام المربّعات بشكل أكبر من خلال جعلها تفاعلية. من خلال إضافة مفتاح التعديل [Clickable][1] إلى عنصر تنسيق داخل المربّع، يمكنك التفاعل مع مستخدم ينقر على عنصر التنسيق هذا.

تسرد هذه الصفحة العديد من الإجراءات الشائعة التي ينفذها المستخدمون ضمن المربعات التفاعلية، بالإضافة إلى إرشادات حول كيفية تنفيذ هذا السلوك في مربّعات تطبيقك.

تحميل تنسيق جديد للمربّعات

يمكنك استخدام [LoadAction][2] لإعادة تحميل تنسيق مربّعك عندما ينقر المستخدم على عنصر تفاعلي.

في مقتطف الرمز التالي، يتم تمرير المعرّف القابل للنقر والمحدّد في [setId()][3] مع استدعاء onTileRequest()، لذا يمكنك عرض تنسيق مختلف استنادًا إلى هذا المعرّف:

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()

لتحميل نشاط باستخدام [رابط لصفحة في التطبيق][5]، يمكنك ربط عنصر قابل للنقر بكائن 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()

بعد ذلك، استخدِم كائن TaskStackBuilder في طريقة onTileRequest() كمساعد:

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

تحميل نشاط تم تصديره

لتحميل نشاط تم تصديره حسب اسم الصف ومع إضافات intent، استخدِم [LaunchAction][6].

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()

داخل النشاط الذي تم إطلاقه، يمكنك استرداد رقم التعريف الذي تم استخدامه للمربّع كما هو موضّح في المثال التالي:

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