এই উদাহরণটি দেখায় কিভাবে কোটলিন এবং ViewTreeObserver.OnGlobalLayoutListener ব্যবহার করে অ্যান্ড্রয়েড ভিউর আসল উইডথ এবং হাইট রানটাইমে জানা যায়। onCreate-এ ভিউর সাইজ ০ থাকে, তাই এই লিসেনার ব্যবহার করা হয়।
প্রথম ধাপ: নতুন প্রজেক্ট তৈরি করুন
Android Studio-তে File → New Project এ যান এবং প্রয়োজনীয় বিবরণ পূরণ করে একটি নতুন প্রজেক্ট তৈরি করুন।
দ্বিতীয় ধাপ: লেআউট XML ডিজাইন করুন
res/layout/activity_main.xml ফাইলে নিচের কোড যোগ করুন। একটি ইমেজ ভিউ এবং তার সাইজ দেখানোর টেক্সট ভিউ:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="8dp"
tools:context=".MainActivity">
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="500dp"
android:layout_gravity="center"
android:src="@drawable/ic_launcher_foreground"
android:scaleType="centerCrop" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/imageView"
android:layout_centerInParent="true"
android:layout_marginTop="20sp"
android:textColor="@android:color/background_dark"
android:textSize="16sp"
android:textStyle="bold" />
</RelativeLayout>
তৃতীয় ধাপ: ড্রয়েবলে ইমেজ যোগ করুন
res/drawable ফোল্ডারে যেকোনো ইমেজ (image.png/jpg) কপি করুন বা ডিফল্ট ic_launcher_foreground ব্যবহার করুন।
চতুর্থ ধাপ: MainActivity.kt তে ViewTreeObserver ব্যবহার করুন
src/MainActivity.kt ফাইলে নিচের কোড যোগ করুন:
import android.os.Bundle
import android.view.View
import android.view.ViewTreeObserver.OnGlobalLayoutListener
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
private lateinit var imageView: ImageView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "KotlinApp"
imageView = findViewById(R.id.imageView)
// গ্লোবাল লেআউট লিসেনার যোগ করুন
imageView.viewTreeObserver.addOnGlobalLayoutListener(GetViewSize())
}
private inner class GetViewSize : OnGlobalLayoutListener {
override fun onGlobalLayout() {
// লিসেনার রিমুভ করুন (বারবার কল না হয় সেজন্য)
imageView.viewTreeObserver.removeOnGlobalLayoutListener(this)
val view = findViewById<View>(R.id.imageView)
val width = view.width
val height = view.height
val textView = findViewById<TextView>(R.id.textView)
textView.text = String.format("উইডথ: %d px, হাইট: %d px", width, height)
}
}
}
পঞ্চম ধাপ: ম্যানিফেস্ট ফাইল
androidManifest.xml ফাইলটি সাধারণ থাকবে।
গুরুত্বপূর্ণ নোট
- OnGlobalLayoutListener: লেআউট পাস হলে একবার কল হয়। অবশ্যই রিমুভ করুন, না হলে বারবার কল হবে।
- API 16+:
removeOnGlobalLayoutListener()ব্যবহার করুন। API 16-এর নিচেremoveGlobalOnLayoutListener()(ডিপ্রিকেটেড)। - বিকল্প পদ্ধতি:
view.doOnLayout { ... }(KTX এক্সটেনশন, androidx.core:core-ktx)view.addOnLayoutChangedListener { ... }(API 11+)view.post { ... }- মেইন থ্রেডের শেষে রান করে, তখনও সাইজ পাওয়া যায়।
- ConstraintLayout ব্যবহার করলে
OnGlobalLayoutListenerসবচেয়ে নির্ভরযোগ্য।
অ্যাপ্লিকেশন চালানোর নির্দেশনা
অ্যান্ড্রয়েড ডিভাইস সংযুক্ত করে Run করুন। অ্যাপ লোড হওয়ার সাথে সাথে ImageView-এর আসল উইডথ এবং হাইট পিক্সেলে TextView-এ দেখাবে।