返回介绍

Android Spinner widget

发布于 2025-02-22 22:20:09 字数 11100 浏览 0 评论 0 收藏 0

In this chapter of the Android development tutorial we will present a spinner widget.

A spinner widget enables a user to select an item from a list of options. In the normal state it shows the currently selected item. Clicking on the spinner widget shows a dropdown menu with all available items. The user can choose a new one from the list. The Spinner class is used to create a spinner widget.

The Spinner widget can be populated in the XML file. Or it can be programmatically filled. In the latter case we need an Adapter class to populate the Spinner widget. An adapter is a bridge between a Spinner and its data.

Spinner I

In the first example we have a Spinner widget whose items are defined in an XML file.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.zetcode.finish"
    android:versionCode="1"
    android:versionName="1.0">
 <application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
  <activity android:name="MainActivity"
        android:label="@string/app_name">
    <intent-filter>
      <action android:name="android.intent.action.MAIN" />
      <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
  </activity>
 </application>
</manifest>

This is the manifest file for the program.

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  >
   <Spinner
    android:id="@+id/spn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:entries="@array/dlangs"
    android:layout_marginTop="10dip"
    android:prompt="@string/spn_title" />

   <TextView
    android:id="@+id/tvId"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    android:layout_marginTop="10dip"
    />    
    
</LinearLayout>

In the main.xml layout file, we have a Spinner and a TextView . The android:entries="@array/dlangs" attribute defines a XML resource that provides an array of strings. The strings are written in the strings.xml file.

strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="app_name">Spinner</string>
  <string name="spn_title">Choose a language</string>
  
  <string-array name="dlangs">
    <item>Python</item>
    <item>PHP</item>
    <item>Perl</item>
    <item>Tcl</item>
    <item>Ruby</item>
  </string-array>  
  
</resources>

In the strings.xml file we have the elements of the string array. These are displayed when we click on the Spinner widget.

MainActivity.java

package com.zetcode.spinner;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Spinner;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;


public class MainActivity extends Activity implements OnItemSelectedListener 
{
  private TextView tv;

  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    tv = (TextView) findViewById(R.id.tvId);

    Spinner spn = (Spinner) findViewById(R.id.spn);
    spn.setOnItemSelectedListener(this);
  }

  @Override
  public void onItemSelected(AdapterView<?> parent, View v, int pos, long id) 
  {
    String item = parent.getItemAtPosition(pos).toString();
    tv.setText(item);
  }

  @Override
  public void onNothingSelected(AdapterView<?> arg0) 
  {    
    tv.setText("");
  }
}

The selected item from the Spinner widget is displayed in the TextView widget.

public class MainActivity extends Activity implements OnItemSelectedListener 

The MainActivity class implements the OnItemSelectedListener . The class must now implement two methods. The onItemSelected() and onNothingSelected() methods.

Spinner spn = (Spinner) findViewById(R.id.spn);
spn.setOnItemSelectedListener(this);

These two lines get the reference to the Spinner widget and set the OnItemSelectedListener for it.

@Override
public void onItemSelected(AdapterView<?> parent, View v, int pos, long id) 
{
  String item = parent.getItemAtPosition(pos).toString();
  tv.setText(item);
}

In the onItemSelected() method we get the currently selected Spinner item with the getItemAtPosition() . The item is transformed to a string and set to the TextView .

Spinner widget
Figure: Spinner widget

Spinner II

In the second spinner example, we will define our list of spinner elements programmatically. For this we will use the ArrayAdapter in conjunction with the ArrayList .

An Adapter design pattern is used by Android platform to work with the Spinner widget. The ArrayAdapter is an intermediary between the data source and the data view. In this case the data source is the ArrayList and the view is the Spinner widget. Using an adapter we are decoupling our code.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.zetcode.toast"
    android:versionCode="1"
    android:versionName="1.0">
  <application android:label="@string/app_name" 
      android:icon="@drawable/ic_launcher">
    <activity android:name="MainActivity"
          android:label="@string/app_name">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
  </application>
</manifest>

This is the manifest file.

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  >
  
  <Spinner
    android:id="@+id/spnId"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dip" 
    android:prompt="@string/spn_title" />  
    
  <TextView
  android:id="@+id/tvId"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:layout_marginTop="10dip"  />
  
</LinearLayout>

In the main.xml file we have two widgets. The Spinner and the TextView widget. This time we do not define the array data entries for the Spinner .

strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="app_name">Spinner2</string>
  <string name="spn_title">Choose a language</string>
</resources>

This is the strings.xml resource file.

MainActivity.java

package com.zetcode.spinner2;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Spinner;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;


public class MainActivity extends Activity implements OnItemSelectedListener
{
  private TextView tv;
  private Spinner spn;
  
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    setup();
  }

  public void setup()
  {
    tv = (TextView) findViewById(R.id.tvId);
   
    spn = (Spinner) findViewById(R.id.spnId);
    fillSpinner(spn);
    spn.setOnItemSelectedListener(this);
  }

  public void fillSpinner(Spinner spn) 
  {
    List<String> lst = new ArrayList<String>();
    lst.add("Python");
    lst.add("PHP");
    lst.add("Perl");
    lst.add("Tcl");
    lst.add("Ruby");
    
    ArrayAdapter<String> da = new ArrayAdapter<String>(this,
        android.R.layout.simple_spinner_item, lst);
    da.setDropDownViewResource(android.R.layout.simple_spinner_item);

    spn.setAdapter(da);
  }

  @Override
  public void onItemSelected(AdapterView<?> parent, View v, int pos, long id) 
  {
    String item = parent.getItemAtPosition(pos).toString();
    tv.setText(item);
  }

  @Override
  public void onNothingSelected(AdapterView<?> arg0) 
  {    
    tv.setText("");
  }
}

In the MainActivity.java source file we fill the Spinner widget with data and implement the OnItemSelectedListener for the widget.

spn = (Spinner) findViewById(R.id.spnId);
fillSpinner(spn);

We get the reference to the Spinner widget and call the fillSpinner() method to populate it with data.

List<String> lst = new ArrayList<String>();
lst.add("Python");
lst.add("PHP");
lst.add("Perl");
lst.add("Tcl");
lst.add("Ruby");

An ArrayList is created and filled with strings.

ArrayAdapter<String> da = new ArrayAdapter<String>(this,
    android.R.layout.simple_spinner_item, lst);

The instance of the ArrayAdapter is created. It takes the ArrayList as a parameter.

da.setDropDownViewResource(android.R.layout.simple_spinner_item);

This line determines the look of the dropdown menu of the Spinner widget. This one is a dropdown without radio buttons. A spinner with the android.R.layout.simple_spinner_dropdown_item defined has radio buttons in its rows.

spn.setAdapter(da);

The adapter is set for the Spinner widget.

Spinner dropdown menu
Figure: Spinner dropdown menu

In this chapter of the Android development tutorial, we have written about a spinner widget.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文