রচনায় শব্দার্থবিদ্যা

একটি রচনা আপনার অ্যাপের UI বর্ণনা করে এবং কম্পোজেবল চালানোর মাধ্যমে তৈরি করা হয়। রচনাটি একটি ট্রি-কাঠামো যা আপনার UI বর্ণনা করে এমন কম্পোজেবল নিয়ে গঠিত।

কম্পোজিশনের পাশে, একটি সমান্তরাল গাছ রয়েছে, যাকে শব্দার্থবিদ্যা গাছ বলা হয়। এই ট্রিটি আপনার UI কে একটি বিকল্প পদ্ধতিতে বর্ণনা করে যা অ্যাক্সেসিবিলিটি পরিষেবা এবং টেস্টিং ফ্রেমওয়ার্কের জন্য বোধগম্য৷ অ্যাক্সেসিবিলিটি পরিষেবাগুলি একটি নির্দিষ্ট প্রয়োজনের সাথে ব্যবহারকারীদের কাছে অ্যাপটি বর্ণনা করতে ট্রি ব্যবহার করে। টেস্টিং ফ্রেমওয়ার্ক আপনার অ্যাপের সাথে ইন্টারঅ্যাক্ট করতে এবং এটি সম্পর্কে দাবী করতে ট্রি ব্যবহার করে। শব্দার্থবিদ্যা গাছে আপনার কম্পোজেবলগুলি কীভাবে আঁকতে হয় সে সম্পর্কে তথ্য থাকে না, তবে এতে আপনার কম্পোজেবলের শব্দার্থিক অর্থ সম্পর্কে তথ্য রয়েছে।

একটি সাধারণ UI অনুক্রম এবং এর শব্দার্থবিদ্যা গাছ
চিত্র 1. একটি সাধারণ UI অনুক্রম এবং এর শব্দার্থবিদ্যা গাছ।

যদি আপনার অ্যাপে কম্পোজ ফাউন্ডেশন এবং ম্যাটেরিয়াল লাইব্রেরি থেকে কম্পোজেবল এবং মডিফায়ার থাকে, তাহলে সেমেন্টিকস ট্রি আপনার জন্য স্বয়ংক্রিয়ভাবে পূর্ণ এবং জেনারেট হবে। তবে আপনি যখন কাস্টম নিম্ন-স্তরের কম্পোজেবল যোগ করছেন, তখন আপনাকে ম্যানুয়ালি এর শব্দার্থক প্রদান করতে হবে । এমন পরিস্থিতিও থাকতে পারে যেখানে আপনার গাছটি পর্দায় থাকা উপাদানগুলির অর্থ সঠিকভাবে বা সম্পূর্ণরূপে উপস্থাপন করে না, এই ক্ষেত্রে আপনি গাছটিকে মানিয়ে নিতে পারেন।

উদাহরণস্বরূপ এই কাস্টম ক্যালেন্ডার কম্পোজযোগ্য বিবেচনা করুন:

নির্বাচনযোগ্য দিনের উপাদান সহ একটি কাস্টম ক্যালেন্ডার রচনা করা যায়
চিত্র 2. একটি কাস্টম ক্যালেন্ডার নির্বাচনযোগ্য দিনের উপাদান সহ কম্পোজযোগ্য।

এই উদাহরণে, সম্পূর্ণ ক্যালেন্ডারটি একটি একক নিম্ন-স্তরের কম্পোজেবল হিসাবে প্রয়োগ করা হয়েছে, Layout কম্পোজেবল ব্যবহার করে এবং সরাসরি Canvas আঁকা। আপনি যদি অন্য কিছু না করেন, অ্যাক্সেসিবিলিটি পরিষেবাগুলি কম্পোজেবলের বিষয়বস্তু এবং ক্যালেন্ডারের মধ্যে ব্যবহারকারীর নির্বাচন সম্পর্কে যথেষ্ট তথ্য পাবে না৷ উদাহরণস্বরূপ, যদি একজন ব্যবহারকারী 17 ধারণ করা দিনে ক্লিক করেন, তবে অ্যাক্সেসিবিলিটি ফ্রেমওয়ার্ক পুরো ক্যালেন্ডার নিয়ন্ত্রণের জন্য শুধুমাত্র বিবরণ তথ্য গ্রহণ করে। এই ক্ষেত্রে, টকব্যাক অ্যাক্সেসিবিলিটি পরিষেবা "ক্যালেন্ডার" বা, শুধুমাত্র একটু ভালো, "এপ্রিল ক্যালেন্ডার" ঘোষণা করবে এবং ব্যবহারকারীরা কোন দিনটি বেছে নেওয়া হয়েছে তা নিয়ে আশ্চর্য হয়ে যাবে। এই কম্পোজযোগ্য আরও অ্যাক্সেসযোগ্য করতে, আপনাকে ম্যানুয়ালি শব্দার্থিক তথ্য যোগ করতে হবে।

শব্দার্থবিদ্যা বৈশিষ্ট্য

কিছু শব্দার্থক অর্থ সহ UI ট্রির সমস্ত নোডের শব্দার্থবিদ্যা গাছে একটি সমান্তরাল নোড রয়েছে। শব্দার্থবিদ্যা গাছের নোডটিতে সেই বৈশিষ্ট্যগুলি রয়েছে যা সংশ্লিষ্ট কম্পোজেবলের অর্থ প্রকাশ করে। উদাহরণস্বরূপ, Text কম্পোজেবল একটি শব্দার্থিক সম্পত্তি text ধারণ করে, কারণ এটি সেই কম্পোজেবলের অর্থ । একটি Icon একটি contentDescription বৈশিষ্ট্য রয়েছে (যদি বিকাশকারী দ্বারা সেট করা থাকে) যা পাঠ্যের মাধ্যমে বোঝায় যে Icon অর্থ কী। কম্পোজ ফাউন্ডেশন লাইব্রেরির উপরে নির্মিত কম্পোজেবল এবং মডিফায়ারগুলি ইতিমধ্যেই আপনার জন্য প্রাসঙ্গিক বৈশিষ্ট্যগুলি সেট করেছে। ঐচ্ছিকভাবে, semantics এবং clearAndSetSemantics সংশোধকগুলির সাথে বৈশিষ্ট্যগুলি নিজেই সেট বা ওভাররাইড করুন৷ উদাহরণস্বরূপ, একটি নোডে কাস্টম অ্যাক্সেসিবিলিটি অ্যাকশন যোগ করুন, একটি টগলযোগ্য উপাদানের জন্য একটি বিকল্প স্টেট বর্ণনা প্রদান করুন, অথবা নির্দেশ করুন যে একটি নির্দিষ্ট পাঠ্য রচনাযোগ্য একটি শিরোনাম হিসাবে বিবেচনা করা উচিত।

শব্দার্থবিদ্যা ট্রি কল্পনা করতে, লেআউট ইন্সপেক্টর টুল ব্যবহার করুন বা পরীক্ষার ভিতরে printToLog() পদ্ধতি ব্যবহার করুন। এটি Logcat-এর ভিতরে বর্তমান শব্দার্থবিদ্যা ট্রি প্রিন্ট করে।

class MyComposeTest {

    @get:Rule
    val composeTestRule = createComposeRule()

    @Test
    fun MyTest() {
        // Start the app
        composeTestRule.setContent {
            MyTheme {
                Text("Hello world!")
            }
        }
        // Log the full semantics tree
        composeTestRule.onRoot().printToLog("MY TAG")
    }
}

এই পরীক্ষার আউটপুট হবে:

    Printing with useUnmergedTree = 'false'
    Node #1 at (l=0.0, t=63.0, r=221.0, b=120.0)px
     |-Node #2 at (l=0.0, t=63.0, r=221.0, b=120.0)px
       Text = '[Hello world!]'
       Actions = [GetTextLayoutResult]

শব্দার্থবিদ্যার বৈশিষ্ট্যগুলি কীভাবে কম্পোজেবলের অর্থ প্রকাশ করে তা বিবেচনা করুন। একটি Switch বিবেচনা করুন. এটি ব্যবহারকারীর কাছে এটি দেখতে কেমন:

চিত্র 3. একটি সুইচ তার "চালু" এবং "বন্ধ" অবস্থায়..

এই উপাদানটির অর্থ বর্ণনা করার জন্য, আপনি নিম্নলিখিতটি বলতে পারেন: "এটি একটি সুইচ, যা এটির 'অন' অবস্থায় একটি টগলযোগ্য উপাদান। আপনি এটির সাথে ইন্টারঅ্যাক্ট করতে এটি ক্লিক করতে পারেন।"

এই শব্দার্থবিদ্যা বৈশিষ্ট্য ঠিক কি জন্য ব্যবহার করা হয়. এই স্যুইচ উপাদানটির শব্দার্থবিদ্যা নোডে নিম্নলিখিত বৈশিষ্ট্যগুলি রয়েছে, যেমনটি লেআউট ইন্সপেক্টরের সাথে কল্পনা করা হয়েছে:

লেআউট ইন্সপেক্টর একটি সুইচ কম্পোজেবলের শব্দার্থবিদ্যা বৈশিষ্ট্য দেখাচ্ছে
চিত্র 4. লেআউট ইন্সপেক্টর একটি সুইচ কম্পোজেবলের শব্দার্থবিদ্যা বৈশিষ্ট্য দেখাচ্ছে।

Role উপাদানের ধরন নির্দেশ করে। StateDescription বর্ণনা করে কিভাবে "চালু" অবস্থা উল্লেখ করা উচিত। ডিফল্টরূপে এটি "চালু" শব্দের একটি স্থানীয় সংস্করণ, তবে এটিকে আরও নির্দিষ্ট করা যেতে পারে (উদাহরণস্বরূপ, "সক্ষম") প্রসঙ্গের উপর ভিত্তি করে। ToggleableState হল সুইচের বর্তমান অবস্থা। OnClick সম্পত্তি এই উপাদানটির সাথে ইন্টারঅ্যাক্ট করতে ব্যবহৃত পদ্ধতির উল্লেখ করে। শব্দার্থবিদ্যার বৈশিষ্ট্যগুলির একটি সম্পূর্ণ তালিকার জন্য, SemanticsProperties অবজেক্টটি দেখুন। সম্ভাব্য অ্যাক্সেসিবিলিটি অ্যাকশনের সম্পূর্ণ তালিকার জন্য, SemanticsActions অবজেক্ট দেখুন।

আপনার অ্যাপ্লিকেশানে প্রতিটি কম্পোজেবলের শব্দার্থতত্ত্বের বৈশিষ্ট্যগুলির উপর নজর রাখা অনেকগুলি শক্তিশালী সম্ভাবনাকে আনলক করে৷ কিছু উদাহরণ:

  • টকব্যাক স্ক্রিনে যা দেখানো হয়েছে তা জোরে জোরে পড়ার জন্য বৈশিষ্ট্যগুলি ব্যবহার করে এবং ব্যবহারকারীকে এটির সাথে সহজে ইন্টারঅ্যাক্ট করতে দেয়। সুইচ কম্পোজেবলের জন্য, টকব্যাক বলতে পারে: "চালু; সুইচ; টগল করতে ডবল ট্যাপ করুন"। ব্যবহারকারী সুইচ অফ টগল করতে তাদের স্ক্রিনে ডবল ট্যাপ করতে পারেন।
  • টেস্টিং ফ্রেমওয়ার্ক নোডগুলি খুঁজে বের করতে, তাদের সাথে ইন্টারঅ্যাক্ট করতে এবং দাবী করতে বৈশিষ্ট্যগুলি ব্যবহার করে। সুইচের জন্য একটি নমুনা পরীক্ষা হতে পারে:
    val mySwitch = SemanticsMatcher.expectValue(
        SemanticsProperties.Role, Role.Switch
    )
    composeTestRule.onNode(mySwitch)
        .performClick()
        .assertIsOff()

একত্রিত এবং আনমার্জ করা শব্দার্থবিদ্যা গাছ

পূর্বে উল্লিখিত হিসাবে, UI ট্রিতে প্রতিটি কম্পোজেবলে শূন্য বা তার বেশি শব্দার্থবিদ্যা বৈশিষ্ট্য সেট থাকতে পারে। যখন একটি কম্পোজেবলের কোনো শব্দার্থবিদ্যা বৈশিষ্ট্য সেট না থাকে, তখন এটি শব্দার্থবিদ্যা গাছের অংশ হিসেবে অন্তর্ভুক্ত হয় না। এইভাবে, শব্দার্থবিদ্যা ট্রিতে কেবলমাত্র সেই নোডগুলি থাকে যা প্রকৃতপক্ষে শব্দার্থিক অর্থ ধারণ করে। যাইহোক, কখনও কখনও স্ক্রিনে যা দেখানো হয়েছে তার সঠিক অর্থ বোঝাতে, নোডের কিছু উপ-বৃক্ষকে একত্রিত করা এবং তাদের একটি হিসাবে বিবেচনা করাও কার্যকর। এইভাবে আপনি পৃথকভাবে প্রতিটি বংশধর নোডের সাথে ডিল করার পরিবর্তে সামগ্রিকভাবে নোডের একটি সেট সম্পর্কে যুক্তি দিতে পারেন। একটি নিয়ম হিসাবে, এই গাছের প্রতিটি নোড অ্যাক্সেসযোগ্যতা পরিষেবাগুলি ব্যবহার করার সময় একটি ফোকাসযোগ্য উপাদান উপস্থাপন করে।

এই ধরনের কম্পোজেবলের একটি উদাহরণ হল Button । আপনি একটি একক উপাদান হিসাবে একটি বোতাম সম্পর্কে যুক্তি দিতে পারেন, যদিও এতে একাধিক চাইল্ড নোড থাকতে পারে:

Button(onClick = { /*TODO*/ }) {
    Icon(
        imageVector = Icons.Filled.Favorite,
        contentDescription = null
    )
    Spacer(Modifier.size(ButtonDefaults.IconSpacing))
    Text("Like")
}

শব্দার্থবিদ্যা গাছে, বোতামের বংশধরের বৈশিষ্ট্যগুলি একত্রিত করা হয়, এবং বোতামটিকে গাছের একটি একক পাতার নোড হিসাবে উপস্থাপন করা হয়:

একত্রিত একক পাতার শব্দার্থক উপস্থাপনা
চিত্র 5. একত্রিত একক পাতার শব্দার্থতত্ত্ব উপস্থাপনা।

কম্পোজেবল এবং মডিফায়ার ইঙ্গিত করতে পারে যে তারা Modifier.semantics (mergeDescendants = true) {} কল করে তাদের বংশধরের শব্দার্থতত্ত্ব বৈশিষ্ট্য একত্র করতে চায়। এই বৈশিষ্ট্যটিকে true হিসাবে সেট করা ইঙ্গিত করে যে শব্দার্থবিদ্যার বৈশিষ্ট্যগুলিকে একত্রিত করা উচিত৷ Button উদাহরণে, Button কম্পোজেবল অভ্যন্তরীণভাবে clickable সংশোধক ব্যবহার করে যা এই semantics মডিফায়ারকে অন্তর্ভুক্ত করে। অতএব, বোতামের বংশধর নোডগুলি একত্রিত হয়। আপনার কম্পোজেবলে মার্জিং আচরণ কখন পরিবর্তন করা উচিত সে সম্পর্কে আরও জানতে অ্যাক্সেসিবিলিটি ডকুমেন্টেশন পড়ুন।

ফাউন্ডেশন এবং মেটেরিয়াল কম্পোজ লাইব্রেরিতে বেশ কিছু মডিফায়ার এবং কম্পোজেবল এই সম্পত্তি সেট আছে। উদাহরণস্বরূপ, clickable এবং toggleable মডিফায়ারগুলি স্বয়ংক্রিয়ভাবে তাদের বংশধরদের একত্রিত করবে। এছাড়াও, ListItem composable তার বংশধরদের একত্রিত করবে।

গাছ পরিদর্শন করুন

শব্দার্থবিদ্যা গাছ আসলে দুটি ভিন্ন গাছ। একটি মার্জড সেমেন্টিকস ট্রি আছে, যেটি ডিসেন্ডেন্ট নোডগুলিকে মার্জ করে যখন mergeDescendants true সেট করা হয়। এখানে একটি আনমার্জড সেমেন্টিকস ট্রিও রয়েছে, যা মার্জিং প্রয়োগ করে না, কিন্তু প্রতিটি নোডকে অক্ষত রাখে। অ্যাক্সেসিবিলিটি পরিষেবাগুলি আনমার্জড ট্রি ব্যবহার করে এবং mergeDescendants সম্পত্তি বিবেচনা করে তাদের নিজস্ব মার্জিং অ্যালগরিদম প্রয়োগ করে৷ টেস্টিং ফ্রেমওয়ার্ক ডিফল্টরূপে মার্জড ট্রি ব্যবহার করে।

আপনি printToLog() পদ্ধতির মাধ্যমে উভয় গাছ পরিদর্শন করতে পারেন। ডিফল্টরূপে, এবং আগের উদাহরণগুলির মতো, মার্জড ট্রি লগ করা হয়। পরিবর্তে আনমার্জড ট্রি মুদ্রণ করতে, onRoot() ম্যাচারের useUnmergedTree প্যারামিটারটিকে true সেট করুন:

composeTestRule.onRoot(useUnmergedTree = true).printToLog("MY TAG")

লেআউট ইন্সপেক্টর আপনাকে ভিউ ফিল্টারে পছন্দের একটি নির্বাচন করে মার্জড এবং আনমার্জড সিমেন্টিকস ট্রি উভয়ই প্রদর্শন করতে দেয়:

বিন্যাস পরিদর্শক দেখার বিকল্পগুলি, মার্জড এবং আনমার্জড সিমেন্টিকস ট্রি উভয়ের প্রদর্শনের অনুমতি দেয়
চিত্র 6. লেআউট ইন্সপেক্টর ভিউ অপশন, মার্জড এবং আনমার্জড সিমেন্টিকস ট্রি উভয়ের প্রদর্শনের অনুমতি দেয়।

আপনার গাছের প্রতিটি নোডের জন্য, লেআউট ইন্সপেক্টর বৈশিষ্ট্য প্যানেলে সেই নোডের উপর একত্রিত শব্দার্থবিদ্যা এবং শব্দার্থক সেট উভয়ই দেখায়:

শব্দার্থবিদ্যা বৈশিষ্ট্য মার্জ এবং সেট
চিত্র 7. শব্দার্থবিদ্যা বৈশিষ্ট্য একত্রিত এবং সেট।

ডিফল্টরূপে, টেস্টিং ফ্রেমওয়ার্কের মিলাররা একত্রিত শব্দার্থবিদ্যা ট্রি ব্যবহার করে। এই কারণেই আপনি একটি Button ভিতরে দেখানো পাঠ্যের সাথে মিল রেখে তার সাথে ইন্টারঅ্যাক্ট করতে পারেন:

composeTestRule.onNodeWithText("Like").performClick()

ম্যাচারদের useUnmergedTree প্যারামিটারটিকে true এ সেট করে এই আচরণটি ওভাররাইড করুন, যেমন onRoot matcher-এর সাথে।

আচরণ একত্রিত করুন

যখন একটি কম্পোজেবল নির্দেশ করে যে তার বংশধরদের একত্রিত করা উচিত, তখন এই একত্রীকরণটি ঠিক কীভাবে ঘটে?

প্রতিটি শব্দার্থবিদ্যা সম্পত্তির একটি সংজ্ঞায়িত মার্জিং কৌশল আছে। উদাহরণ স্বরূপ, ContentDescription প্রপার্টি একটি তালিকায় সমস্ত ডিসেন্ডেন্ট ContentDescription মান যোগ করে। SemanticsProperties.kt এ এর mergePolicy বাস্তবায়ন পরীক্ষা করে শব্দার্থবিদ্যার সম্পত্তির মার্জিং কৌশল পরীক্ষা করুন। বৈশিষ্ট্যগুলি পিতামাতা বা সন্তানের মান নিতে পারে, মানগুলিকে একটি তালিকা বা স্ট্রিংয়ে একত্রিত করতে পারে, একত্রিত হওয়ার অনুমতি দেয় না এবং পরিবর্তে একটি ব্যতিক্রম ছুঁড়ে দিতে পারে, বা অন্য কোন কাস্টম মার্জিং কৌশল।

একটি গুরুত্বপূর্ণ দ্রষ্টব্য হল যে descendants যারা নিজেরাই mergeDescendants = true একত্রিতকরণে অন্তর্ভুক্ত নয়। একটি উদাহরণ দেখুন:

চিত্র, কিছু পাঠ্য এবং একটি বুকমার্ক আইকন সহ আইটেম তালিকাভুক্ত করুন
চিত্র 8. চিত্র, কিছু পাঠ্য এবং একটি বুকমার্ক আইকন সহ আইটেম তালিকা করুন।

এখানে একটি ক্লিকযোগ্য তালিকা আইটেম আছে. ব্যবহারকারী যখন সারিটি চাপেন, অ্যাপটি নিবন্ধের বিস্তারিত পৃষ্ঠায় নেভিগেট করে, যেখানে ব্যবহারকারী নিবন্ধটি পড়তে পারেন। তালিকা আইটেমের ভিতরে, নিবন্ধটিকে বুকমার্ক করার জন্য একটি বোতাম রয়েছে, যা একটি নেস্টেড ক্লিকযোগ্য উপাদান গঠন করে, তাই বোতামটি মার্জ করা গাছে আলাদাভাবে দেখায়। সারির বাকি বিষয়বস্তু একত্রিত করা হয়েছে:

মার্জড ট্রিতে সারি নোডের মধ্যে একটি তালিকায় একাধিক পাঠ্য রয়েছে। আনমার্জ করা ট্রিতে প্রতিটি টেক্সট কম্পোজেবলের জন্য আলাদা নোড থাকে।
চিত্র 9. মার্জ করা ট্রিটিতে সারি নোডের মধ্যে একটি তালিকায় একাধিক পাঠ্য রয়েছে। আনমার্জ করা ট্রিতে প্রতিটি টেক্সট কম্পোজেবলের জন্য আলাদা নোড থাকে।

শব্দার্থবিদ্যা গাছ মানানসই

পূর্বে উল্লিখিত হিসাবে, আপনি নির্দিষ্ট শব্দার্থবিদ্যা বৈশিষ্ট্য ওভাররাইড বা সাফ করতে পারেন বা গাছের একত্রিত আচরণ পরিবর্তন করতে পারেন। এটি বিশেষভাবে প্রাসঙ্গিক যখন আপনি আপনার নিজস্ব কাস্টম উপাদান তৈরি করছেন। সঠিক বৈশিষ্ট্য এবং মার্জ আচরণ সেট না করে, আপনার অ্যাপ অ্যাক্সেসযোগ্য নাও হতে পারে এবং পরীক্ষাগুলি আপনার প্রত্যাশার চেয়ে ভিন্নভাবে আচরণ করতে পারে। কিছু সাধারণ ব্যবহারের ক্ষেত্রে যেখানে আপনার শব্দার্থবিদ্যা গাছকে মানিয়ে নেওয়া উচিত সে সম্পর্কে আরও পড়তে, অ্যাক্সেসিবিলিটি ডকুমেন্টেশন পড়ুন। আপনি যদি পরীক্ষা সম্পর্কে আরও জানতে চান তবে পরীক্ষার নির্দেশিকা দেখুন।

অতিরিক্ত সম্পদ

{% শব্দার্থে %} {% endverbatim %} {% শব্দার্থে %} {% endverbatim %}