ওভারভিউ
Android Spinner-এ ডিফল্টভাবে কোনো "Select an item" টেক্সট দেখানোর বিল্ট-ইন সাপোর্ট নেই। এই টিউটোরিয়ালে একটি ডামি আইটেম লিস্টে যোগ করে এবং সেটিকে হাইড করে ডিফল্ট টেক্সট দেখানোর পদ্ধতি দেখানো হয়েছে।
প্রয়োজনীয় ধাপসমূহ
ধাপ ১: নতুন প্রজেক্ট তৈরি
ধাপ ২: activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="30dp"
android:text="Spinner with Default Text"
android:textColor="@android:color/background_dark"
android:textSize="18sp"
android:textStyle="bold" />
<Spinner
android:id="@+id/spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="16dp" />
</LinearLayout>
ধাপ ৩: MainActivity.kt (ক্লাসিক পদ্ধতি)
import android.os.Bundle
import android.view.View
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.Spinner
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
private lateinit var spinner: Spinner
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "Spinner Demo"
spinner = findViewById(R.id.spinner)
// ডেটা লিস্ট: প্রথম আইটেমটি হবে ডিফল্ট/হিন্ট টেক্সট
val footballPlayers = mutableListOf(
"Select a player", // Position 0 = Default/Hint
"Cristiano Ronaldo",
"Lionel Messi",
"Neymar Jr",
"Isco",
"Gareth Bale",
"Luis Suarez"
)
val adapter = ArrayAdapter(
this,
android.R.layout.simple_spinner_item,
footballPlayers
)
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
spinner.adapter = adapter
// ডিফল্টভাবে প্রথম আইটেম সিলেক্টেড (হিন্ট)
spinner.setSelection(0, false)
spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>, view: View?, position: Int, id: Long) {
if (position == 0) {
// হিন্ট আইটেম সিলেক্টেড - কিছুই করবেন না
return@onItemSelected
}
val selectedPlayer = parent.getItemAtPosition(position) as String
Toast.makeText(parent.context, "Selected: $selectedPlayer", Toast.LENGTH_SHORT).show()
}
override fun onNothingSelected(parent: AdapterView<*>?) {}
}
}
}
ধাপ ৪: AndroidManifest.xml
স্ট্যান্ডার্ড কনফিগারেশন।
🚀 উন্নত পদ্ধতি: কাস্টম অ্যাডাপ্টার দিয়ে হিন্ট আইটেম হাইড করা
উপরের পদ্ধতিতে হিন্ট আইটেম ড্রপডাউন-এ দেখায়। এটি হাইড করতে কাস্টম অ্যাডাপ্টার লাগবে:
CustomSpinnerAdapter.kt
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.TextView
class CustomSpinnerAdapter(
context: Context,
layoutRes: Int,
private val items: List,
private val hint: String
) : ArrayAdapter(context, layoutRes, items) {
// ড্রপডাউন ভিউতে হিন্ট হাইড
override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View {
if (position == 0) {
// হিন্টের জন্য খালি ভিউ রিটার্ন (height=0)
val emptyView = View(context)
emptyView.visibility = View.GONE
emptyView.layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, 0
)
return emptyView
}
return super.getDropDownView(position - 1, convertView, parent)
}
// ড্রপডাউন আইটেম কাউন্ট (হিন্ট বাদে)
override fun getCount(): Int = items.size - 1
// সিলেক্টেড ভিউতে হিন্ট দেখাও
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val view = super.getView(0, convertView, parent)
(view as TextView).text = hint
return view
}
// পজিশন ম্যাপিং
override fun getItem(position: Int): String = items[position + 1]
override fun getItemId(position: Int): Long = position.toLong()
}
ব্যবহার:
val players = listOf("Cristiano Ronaldo", "Lionel Messi", "Neymar Jr", "Isco", "Gareth Bale", "Luis Suarez")
val adapter = CustomSpinnerAdapter(this, android.R.layout.simple_spinner_item, players, "Select a player")
spinner.adapter = adapter
🎯 আধুনিক পদ্ধতি: Material AutoCompleteTextView (সুপারিশ করা)
Spinner-এর বদলে AutoCompleteTextView + TextInputLayout ব্যবহার করুন - এতে বিল্ট-ইন হিন্ট সাপোর্ট রয়েছে:
Dependency:
implementation "com.google.android.material:material:1.11.0"
Layout:
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Select Player"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu">
<AutoCompleteTextView
android:id="@+id/autoComplete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="none" />
</com.google.android.material.textfield.TextInputLayout>
Activity-এ:
val players = listOf("Cristiano Ronaldo", "Lionel Messi", "Neymar Jr", "Isco", "Gareth Bale", "Luis Suarez")
val adapter = ArrayAdapter(this, R.layout.dropdown_item, players)
autoComplete.setAdapter(adapter)
autoComplete.setOnItemClickListener { _, _, position, _ ->
val selected = players[position]
Toast.makeText(this, "Selected: $selected", Toast.LENGTH_SHORT).show()
}
dropdown_item.xml:
<TextView xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:ellipsize="end"
android:maxLines="1"
android:textAppearance="?attr/textAppearanceSubtitle1" />
সারসংক্ষেপ
| পদ্ধতি | প্রসঙ্গ | অবদান |
|---|---|---|
| Dummy item + position check | সহজ, কোড কম | হিন্ট ড্রপডাউন-এ দেখায় |
| Custom Adapter | হিন্ট ড্রপডাউন-এ হাইড | বেশি কোড, ফ্লেক্সিবল |
| Material AutoCompleteTextView | ✅ আধুনিক, বিল্ট-ইন হিন্ট | সেরা UX, Material Design 3 |