The app bar, also known as the action bar, is one of the most important design elements in your app's activities, it allows users to quickly understand how to operate your app and have a great experience .
Android Spinner Widget Provides a quick way to select one value from a set , Touching the spinner displays all available value from which user can select one .
In this tutorial we will see adding spinner widget to ActionBar thru option menu
1. Menu
Inside menu for item tag set the actionViewClass property with AppCompatSpinner class and set showAsAction property with always(Always show this item in an actionbar) .
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/spinner" android:title="@string/action_spinner" app:actionViewClass="androidx.appcompat.widget.AppCompatSpinner" app:showAsAction="always" /> </menu>
2. XML Layout
file : activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"/>
XML Layout for drop down XML layout for spinner items which will be set to adapter
file : layout_drop_title .
XML Layout for Spinner Checked Item this layout set by calling setDropDownViewResource on adapter reference .
file : MainActivity.kt
<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/text1" style="?attr/spinnerDropDownItemStyle" android:singleLine="true" android:layout_width="wrap_content" android:layout_height="?attr/actionBarSize" android:textColor="@android:color/white" android:ellipsize="marquee"/>
XML Layout for Spinner Checked Item this layout set by calling setDropDownViewResource on adapter reference .
file : layout_drop_list .
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/text1" style="?android:attr/spinnerDropDownItemStyle" android:singleLine="true" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:ellipsize="marquee" android:background="@color/colorPrimary" android:textColor="@android:color/white"/>
3. MainActivity
- Inside onCreate function set the above defined XML Layout
- Override the onCreateOptionsMenu fun of Activity and set the above defined xml layout using menuInflater .
- Get the reference of menu item and call getView and then type cast it AppCompatSpinner.
- Create an ArrayAdapter and set it to spinner .
- Set the onItemSelectedListener for spinner widget , when uses selects the items perform the action .
package com.tutorialsbuzz.toolbarspinner import android.os.Bundle import android.view.Menu import android.view.View import android.widget.AdapterView import android.widget.ArrayAdapter import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.AppCompatSpinner import java.util.* class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.main_menu, menu) val item = menu?.findItem(R.id.spinner) val spinner = item?.actionView as AppCompatSpinner var arrayAdapter = ArrayAdapter(this@MainActivity, R.layout.layout_drop_title, getCountries()) arrayAdapter.setDropDownViewResource(R.layout.layout_drop_list) spinner.adapter = arrayAdapter spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected(p0: AdapterView<*>?, view: View?, position: Int, id: Long) { showToast(getCountries()[position] + " selected") } override fun onNothingSelected(p0: AdapterView<*>?) {} } return true } private fun getCountries(): MutableList<String> { val mdList = mutableListOf<String>() for (countryISO in Locale.getISOCountries()) { val locale = Locale("", countryISO) if (!locale.displayCountry.isEmpty()) { mdList.add(locale.displayCountry + " " + counrtyFlag(countryISO)) } } return mdList } private fun counrtyFlag(countryCode: String): String { val flagOffset = 0x1F1E6 val asciiOffset = 0x41 val firstChar = Character.codePointAt(countryCode, 0) - asciiOffset + flagOffset val secondChar = Character.codePointAt(countryCode, 1) - asciiOffset + flagOffset return (String(Character.toChars(firstChar)) + String(Character.toChars(secondChar))) } private fun showToast(msg: String) { Toast.makeText( this@MainActivity, msg, Toast.LENGTH_SHORT ).show() } }
No comments:
Post a Comment