টাইলস কেবল তথ্য প্রদর্শনের চেয়ে আরও বেশি কিছু করতে পারে; তারা ইন্টারেক্টিভও হতে পারে। textButton()
ট্যাপের প্রতিক্রিয়ার মতো একটি উপাদান তৈরি করতে, clickable()
ব্যবহার করে একটি ক্লিক হ্যান্ডলার তৈরি করুন এবং এটিকে লেআউট উপাদানের সাথে সংযুক্ত করুন।
আপনি দুটি প্রধান উপায়ে একটি অ্যাকশন ট্রিগার করতে একটি Clickable
কনফিগার করতে পারেন:
- সরাসরি একটি ক্রিয়াকলাপ চালু করুন : যে ক্ষেত্রে আপনাকে অবিলম্বে একটি ক্রিয়াকলাপ খুলতে হবে সেগুলির জন্য
launchAction()
ব্যবহার করুন৷ - আপনার টাইল সার্ভিসে অর্পণ করুন : আপনার
TileService
মধ্যে যুক্তি ট্রিগার করতেloadAction()
ব্যবহার করুন। এটি একটি আরও নমনীয় পদ্ধতি যা আপনাকে টাইলের বিষয়বস্তু রিফ্রেশ করতে, এর অবস্থা আপডেট করতে বা আরও জটিল কার্যকলাপ চালু করতে দেয়।
একটি রপ্তানি কার্যকলাপ চালু করুন
যদি একজন ব্যবহারকারীর ট্যাপ অবিলম্বে একটি কার্যকলাপ চালু করে, launchAction()
ব্যবহার করুন। কার্যকলাপ সনাক্ত করতে একটি ComponentName
প্রদান করুন. কার্যকলাপ রপ্তানি করা আবশ্যক. এই পদ্ধতির সাহায্যে, আপনি অ্যাকশনের সাথে Intent
এক্সট্রা পাস করতে পারেন। যাইহোক, কাস্টম Intent
ফ্ল্যাগ সেট করা সম্ভব নয়।
নিচের উদাহরণটি দেখায় কিভাবে দুটি অতিরিক্ত, name
এবং age
সহ TileActivity
চালু করতে একটি Clickable
তৈরি করা যায়:
textButton( labelContent = { text("launchAction()".layoutString, typography = BODY_LARGE) }, onClick = clickable( action = launchAction( ComponentName( "com.example.wear", "com.example.wear.snippets.m3.tile.TileActivity", ), mapOf( "name" to ActionBuilders.stringExtra("Bartholomew"), "age" to ActionBuilders.intExtra(21), ), ) ), )
চালু করা কার্যকলাপের ভিতরে, অভিপ্রায় অতিরিক্ত থেকে মান পুনরুদ্ধার করুন:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // When this activity is launched from the tile InteractionLaunchAction, // "name" will be "Bartholomew" and "age" will be 21 val name = intent.getStringExtra("name") val age = intent.getStringExtra("age") // ... }
আপনার টাইল পরিষেবাতে মিথস্ক্রিয়া পরিচালনা করুন
আরো নমনীয় ইন্টারঅ্যাকশনের জন্য, loadAction()
ব্যবহার করুন। যখন একজন ব্যবহারকারী loadAction
সাথে কনফিগার করা একটি উপাদানে ট্যাপ করে, তখন সিস্টেমটি আপনার TileService.onTileRequest()
পুনরায় আহ্বান করে। এটি আপনাকে টাইল আপডেট করতে, এর অবস্থা পরিবর্তন করতে এবং আরও জটিল কাজ সম্পাদন করতে আপনার পরিষেবাতে যুক্তি চালাতে দেয়।
টাইলের বিষয়বস্তু রিফ্রেশ করুন
loadAction
সহজতম ব্যবহার হল রিফ্রেশের সংকেত। কোন যুক্তি ছাড়া loadAction
কল. ট্যাপ করা হলে, সিস্টেমটি কল করে onTileRequest()
, আপনার পরিষেবাকে আপডেট করা সামগ্রী সহ একটি নতুন লেআউট ফেরত দেওয়ার অনুমতি দেয়৷
textButton( onClick = clickable(loadAction()), labelContent = { text("Refresh".layoutString) }, )
একাধিক ইন্টারেক্টিভ উপাদানের মধ্যে পার্থক্য করুন
আপনার টাইলে একাধিক ইন্টারেক্টিভ উপাদান থাকলে, আপনি Clickable
সংশোধকের সাথে একটি আইডি সংযুক্ত করতে পারেন:
textButton( labelContent = { text("Deep Link me!".layoutString, typography = BODY_LARGE) }, onClick = clickable(id = "foo", action = loadAction()), )
onTileRequest()
ভিতরে , আপনি কি ক্রিয়া সম্পাদন করবেন তা সিদ্ধান্ত নিতে requestParams.currentState.lastClickableId
ব্যবহার করে এই আইডিটি পরীক্ষা করতে পারেন।
উদাহরণ: একটি গভীর লিঙ্ক সহ একটি কার্যকলাপ চালু করা
এই প্যাটার্নটি একটি গভীর লিঙ্ক সহ একটি কার্যকলাপ চালু করার জন্য আদর্শ। ব্যবহারকারীর ট্যাপ টাইলটি পুনরায় লোড করে, আপনার পরিষেবা আইডি পরীক্ষা করে এবং তারপরে নতুন কার্যকলাপ চালু করে। ব্যাক স্ট্যাক নিয়ন্ত্রণ করতে, ব্যবহারকারীর জন্য একটি ভাল নেভিগেশন অভিজ্ঞতা প্রদান করতে একটি TaskStackBuilder
ব্যবহার করুন। যখন ব্যবহারকারী উপাদানটি ট্যাপ করে, তখন সেগুলিকে সরাসরি গভীর-লিঙ্কযুক্ত স্ক্রিনে নিয়ে যাওয়া হয় (উদাহরণ থেকে message_detail/1
স্ক্রীন)। যেহেতু .addNextIntentWithParentStack()
ব্যবহার করা হয়েছিল, তাই প্যারেন্ট অ্যাক্টিভিটিও ব্যাক স্ট্যাকে যোগ করা হয়েছে। এর অর্থ হল ব্যবহারকারী যদি পিছনে সোয়াইপ করেন, তারা টাইল থেকে অবিলম্বে প্রস্থান করার পরিবর্তে অ্যাপের প্রধান স্ক্রীনে (উদাহরণে MessageList
) নেভিগেট করবে। দ্বিতীয়বার সোয়াইপ করলে সেগুলি টাইলে ফিরে আসে।
override fun onTileRequest( requestParams: RequestBuilders.TileRequest ): ListenableFuture<Tile?> { val lastClickableId = requestParams.currentState.lastClickableId if (lastClickableId == "foo") { TaskStackBuilder.create(this) .addNextIntentWithParentStack( Intent( Intent.ACTION_VIEW, "googleandroidsnippets://app/message_detail/1".toUri(), this, TileActivity::class.java, ) ) .startActivities() } // ... User didn't tap a button (either first load or tapped somewhere else) // ... }
তারপর, TileActivity
এ, googleandroidsnippets://app/message_detail/{id}
প্যাটার্নের সাথে মেলে আপনার নেভিগেশন কনফিগার করুন।
AppScaffold { val navController = rememberSwipeDismissableNavController() SwipeDismissableNavHost( navController = navController, startDestination = "message_list", ) { // ... composable( route = "message_detail/{id}", deepLinks = listOf( navDeepLink { uriPattern = "googleandroidsnippets://app/message_detail/{id}" } ), ) { val id = it.arguments?.getString("id") ?: "0" MessageDetails(details = "message $id") } } }
ব্যবহারকারীর জন্য একটি ভাল নেভিগেশন অভিজ্ঞতা প্রদান করতে TaskStackBuilder
ব্যবহার করুন। যখন ব্যবহারকারী উপাদানটি ট্যাপ করে, তখন সেগুলিকে সরাসরি গভীর-লিঙ্কযুক্ত স্ক্রিনে নিয়ে যাওয়া হয়—এই উদাহরণে, এটি হল message_detail/1
স্ক্রীন। যেহেতু .addNextIntentWithParentStack()
ব্যবহার করা হয়েছিল, তাই প্যারেন্ট অ্যাক্টিভিটিও ব্যাক স্ট্যাকে যোগ করা হয়েছে। এর অর্থ হল ব্যবহারকারী যদি পিছনে সোয়াইপ করেন, তারা টাইল থেকে অবিলম্বে প্রস্থান করার পরিবর্তে অ্যাপের প্রধান স্ক্রীন- উদাহরণে MessageList
পর্যন্ত নেভিগেট করবে। দ্বিতীয়বার সোয়াইপ করলে সেগুলি টাইলে ফিরে আসে।
টাইলের মধ্যে অবস্থা আপডেট করুন
আপনার টাইলটিতে একটি StateBuilders.State
অবজেক্ট রয়েছে যা কী-মান জোড়া সঞ্চয় করে এবং পুনরায় লোড জুড়ে থাকে। একজন ব্যবহারকারী যখন টাইলের সাথে ইন্টারঅ্যাক্ট করে তখন আপনি এই অবস্থা আপডেট করতে loadAction()
ব্যবহার করতে পারেন।
এটি করার জন্য, নতুন রাষ্ট্রের মান ধারণকারী loadAction()
-এ একটি DynamicDataMap
পাস করুন।
textButton( labelContent = { text("loadAction()".layoutString, typography = BODY_LARGE) }, onClick = clickable( action = loadAction( dynamicDataMapOf( stringAppDataKey("name") mapTo "Javier", intAppDataKey("age") mapTo 37, ) ) ), )
যখন onTileRequest()
এই ক্রিয়াটি ট্রিগার হয়, তখন আপনি requestParams.currentState.stateMap
থেকে আপডেট করা ডেটা পড়তে পারেন। এটি এমন মিথস্ক্রিয়াগুলির জন্য দরকারী যা সরাসরি টাইলের ডেটা পরিবর্তন করে, যেমন একটি কাউন্টার বৃদ্ধি করা বা একটি সেটিং টগল করা।
override fun onTileRequest( requestParams: RequestBuilders.TileRequest ): ListenableFuture<Tile> { // When triggered by loadAction(), "name" will be "Javier", and "age" will // be 37. with(requestParams.currentState.stateMap) { val name = this[stringAppDataKey("name")] val age = this[intAppDataKey("age")] } // ... }