যদিও আমি ডেটা বাইন্ডিংয়ের উপর নির্ভর করে কিছু সুন্দর উত্তর পেয়েছি, এক্সএমএল-তে ফ্রেগমেন্ট-মুক্ত বিন্যাস সংজ্ঞাগুলির অনুমতি দেওয়ার সময় খণ্ড রেজোলিউশন সক্ষম করার অর্থে - আমি এই পদ্ধতির সাথে সম্পূর্ণ পরিমাণে যেতে দেখিনি।
বাঁধাই অভিমানী তথ্য এত হয় সক্ষম করা থাকে, এখানে একটি জেনেরিক সমাধান আমি উত্থাপন করতে পারেন; কিছুটা দীর্ঘ তবে এটি অবশ্যই কার্যকর হয় (কিছু সতর্কতার সাথে):
পদক্ষেপ 1: কাস্টম অনক্লিক বাস্তবায়ন
এটি টেপ-অন ভিউ (যেমন বোতাম) এর সাথে সম্পর্কিত প্রসঙ্গগুলির মাধ্যমে খণ্ড-সচেতন অনুসন্ধান চালাবে:
// CustomOnClick.kt
@file:JvmName("CustomOnClick")
package com.example
import android.app.Activity
import android.content.Context
import android.content.ContextWrapper
import android.view.View
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import java.lang.reflect.Method
fun onClick(view: View, methodName: String) {
resolveOnClickInvocation(view, methodName)?.invoke(view)
}
private data class OnClickInvocation(val obj: Any, val method: Method) {
fun invoke(view: View) {
method.invoke(obj, view)
}
}
private fun resolveOnClickInvocation(view: View, methodName: String): OnClickInvocation? =
searchContexts(view) { context ->
var invocation: OnClickInvocation? = null
if (context is Activity) {
val activity = context as? FragmentActivity
?: throw IllegalStateException("A non-FragmentActivity is not supported (looking up an onClick handler of $view)")
invocation = getTopFragment(activity)?.let { fragment ->
resolveInvocation(fragment, methodName)
}?: resolveInvocation(context, methodName)
}
invocation
}
private fun getTopFragment(activity: FragmentActivity): Fragment? {
val fragments = activity.supportFragmentManager.fragments
return if (fragments.isEmpty()) null else fragments.last()
}
private fun resolveInvocation(target: Any, methodName: String): OnClickInvocation? =
try {
val method = target.javaClass.getMethod(methodName, View::class.java)
OnClickInvocation(target, method)
} catch (e: NoSuchMethodException) {
null
}
private fun <T: Any> searchContexts(view: View, matcher: (context: Context) -> T?): T? {
var context = view.context
while (context != null && context is ContextWrapper) {
val result = matcher(context)
if (result == null) {
context = context.baseContext
} else {
return result
}
}
return null
}
দ্রষ্টব্য: আসল অ্যান্ড্রয়েড বাস্তবায়নের উপর ভিত্তি করে ( https://android.googlesource.com/platform/frameworks/base/+/a175a5b/core/java/android/view/View.java#3025 দেখুন )
পদক্ষেপ 2: লেআউট ফাইলগুলিতে ঘোষণামূলক অ্যাপ্লিকেশন
তারপরে, ডেটা বাইন্ডিং সচেতন এক্সএমএল এর:
<layout>
<data>
<import type="com.example.CustomOnClick"/>
</data>
<Button
android:onClick='@{(v) -> CustomOnClick.onClick(v, "myClickMethod")}'
</Button>
</layout>
আদেশ সহকারে
- একটি 'আধুনিক'
FragmentActivity
ভিত্তিক বাস্তবায়ন অনুমান করে
- স্ট্যাকের মধ্যে কেবলমাত্র "শীর্ষ-সর্বাধিক" (অর্থাত্ শেষ ) খণ্ডের পদ্ধতি অনুসন্ধান করতে পারে (যদিও এটি ঠিক করা যেতে পারে, প্রয়োজনে)