使用Kotlin的Android Spinner

时间:2020-02-23 14:29:17  来源:igfitidea点击:

在本教程中,我们将使用Kotlin在Android应用程序中讨论和实现Spinners。
Android Spinner用于在屏幕上创建一个下拉列表。

什么是Android Spinner?

微调框就像一个下拉菜单,其中包含要选择的项目列表。
选择一个值后,微调框将使用所选值返回其默认状态。

在Android 3.0之后,您无法在Spinner中显示提示作为Spinner中的默认状态。
而是显示第一项。

微调器内部的数据已加载有适配器。

请采取以下情况:

假设您需要为手机充电。
为此,必须使用引脚(适配器)将手机充电器连接到配电板上。
然后,适配器为您的手机供电。
在Android中,Spinner就像您的手机一样,它使用适配器加载了数据。
适配器设置数据以及要在微调器中加载的项目的布局。

微调器回调事件

AdapterView.onItemSelectedListener接口用于触发Spinner点击事件回调。

它包含两种方法:

  • onItemSelected
  • onNothingSelected

在下一节中,我们将创建一个新的Android Studio项目,并在我们的应用程序中实现Spinners。
我们将自定义布局,并学习如何处理不同的情况。

Android Spinner Kotlin项目

1. XML布局代码

下面给出了activity_main.xml布局文件的代码。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  android:id="@+id/linearLayout"
  android:gravity="center"
  tools:context=".MainActivity">

  <Spinner
      android:id="@+id/mySpinner"
      android:layout_width="match_parent"
      android:spinnerMode="dialog"
      android:layout_height="wrap_content" 

</LinearLayout>

当android:spinnerMode可以是" dialog"或者" dropdown"时,它会托管一个Spinner。

为了显示提示,您应该使用对话框作为spinnerMode值。

2.微调器XML代码

下面给出了" spinner_right_aligned.xml"的代码。

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/textView"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:gravity="end"
  android:padding="15dp"
  android:textAlignment="gravity"
  android:textColor="@color/colorPrimary"
  android:textSize="16sp"
  

3. MainActivity Kotlin代码

MainActivity.kt类的代码如下。

package net.androidly.androidspinnerkotlin

import android.content.Context
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.Gravity
import android.view.View
import android.widget.*
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity(), AdapterView.OnItemSelectedListener {

  var languages = arrayOf("Java", "PHP", "Kotlin", "Javascript", "Python", "Swift")
  val NEW_SPINNER_ID = 1

  override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_main)

      var aa = ArrayAdapter(this, android.R.layout.simple_spinner_item, languages)
      aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)

      with(mySpinner)
      {
          adapter = aa
          setSelection(0, false)
          onItemSelectedListener = this@MainActivity
          prompt = "Select your favourite language"
          gravity = Gravity.CENTER

      }

      val spinner = Spinner(this)
      spinner.id = NEW_SPINNER_ID

      val ll = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)

      ll.setMargins(10, 40, 10, 10)
      linearLayout.addView(spinner)

      aa = ArrayAdapter(this, R.layout.spinner_right_aligned, languages)
      aa.setDropDownViewResource(R.layout.spinner_right_aligned)

      with(spinner)
      {
          adapter = aa
          setSelection(0, false)
          onItemSelectedListener = this@MainActivity
          layoutParams = ll
          prompt = "Select your favourite language"
          setPopupBackgroundResource(R.color.material_grey_600)

      }

  }

  override fun onNothingSelected(parent: AdapterView<*>?) {
      showToast(message = "Nothing selected")
  }

  override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {

      when (view?.id) {
          1 -> showToast(message = "Spinner 2 Position:${position} and language: ${languages[position]}")
          else -> {
              showToast(message = "Spinner 1 Position:${position} and language: ${languages[position]}")
          }
      }
  }

  private fun showToast(context: Context = applicationContext, message: String, duration: Int = Toast.LENGTH_LONG) {
      Toast.makeText(context, message, duration).show()
  }
}

重要事项:

  • 感谢Kotlin Android扩展,XML Spinner小部件可在我们的Kotlin Activity类中自动提供。

  • 我们创建了一个由编程语言组成的" arrayOf"字符串。
    这些使用ArrayAdapter填充到适配器中。

  • setDropDownViewResource用于设置选定状态和微调框列表行的布局。

  • android.R.layout.simple_spinner_item用于设置默认的Android SDK布局。
    默认情况下,TextView在这种布局中保持对齐。

我们已经以编程方式创建了第二个Spinner,可以从" spinner_right_aligned.xml"文件中加载布局。

setSelection(0,false)用于防止创建活动时触发Spinner的OnItemSelected方法。

它是如何工作的? setSelection()方法告知活动已选择了第一个微调器项目。
我们必须在" onItemSelectedListener = this"之前放置此语句。

setPopupBackgroundResource用于在下拉列表上设置背景颜色。

在onItemSelected函数内部,我们使用when语句为相应的Spinner项触发Toast。

感谢Kotlin和具有默认值的函数,我们减少了对Toast的冗长调用。