Android 中 Spinner下拉框使用

先用起来

效果图
在这里插入图片描述

布局页面 activity_test

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="20dp">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/tv_tip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:text="配送方式" />

        <Spinner
            android:id="@+id/spinner"
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:layout_marginLeft="10dp"
            android:layout_toRightOf="@+id/tv_tip"
            android:background="#E5E5E5"
            android:dropDownVerticalOffset="45dp"
            android:spinnerMode="dropdown" />

        <ImageView
            android:layout_width="10dp"
            android:layout_height="10dp"
            android:src="@mipmap/ic_triangle_down"
            android:layout_alignRight="@+id/spinner"
            android:layout_marginRight="10dp"
            android:layout_centerVertical="true"/>
    </RelativeLayout>
</LinearLayout>

代码

public class TestActivity extends AppCompatActivity {
    private String[] starArray = {"圆通", "申通", "邮政"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        initSpinner();
    }

    private void initSpinner() {
        //声明一个下拉列表的数组适配器
        ArrayAdapter<String> starAdapter = new ArrayAdapter<String>(this, R.layout.item_select, starArray);
        //设置数组适配器的布局样式
        starAdapter.setDropDownViewResource(R.layout.item_dropdown);
        //从布局文件中获取名叫sp_dialog的下拉框
        Spinner sp = findViewById(R.id.spinner);
        //设置下拉框的标题,不设置就没有难看的标题了
        sp.setPrompt("请选择配送方式");
        //设置下拉框的数组适配器
        sp.setAdapter(starAdapter);
        //设置下拉框默认的显示第一项
        sp.setSelection(0);
        //给下拉框设置选择监听器,一旦用户选中某一项,就触发监听器的onItemSelected方法
        sp.setOnItemSelectedListener(new MySelectedListener());
    }

    class MySelectedListener implements AdapterView.OnItemSelectedListener {

        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
            Toast.makeText(TestActivity.this, "您选择的是:" + starArray[i], Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {

        }
    }
}

未选中布局 item_drapdown

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:textColor="@android:color/black"
    android:textSize="14sp"
    android:gravity="center"/>

选中布局 item_select

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:background="#E5E5E5"
    android:textSize="14sp"
    android:gravity="center"/>

方法和属性

setPrompt:设置标题文字。拉列表的展示方式有两种,一种是在当前下拉框的正下方展示列表,此时把spinnerMode属性设置为dropdown;另一种是在页面中部以对话框形式展示列表,此时把SpinnerMode属性设置为dialog,这个setPrompt方法就是在对话框时设置标题
setAdapter:设置下拉列表的适配器。
setSelection:设置当前选中哪项。注意该方法要在setAdapter方法之后调用。
setOnItemSelectedListener:设置下拉列表的选择监听器,该监听器要实现接口OnItemSelectedListener。

android:dropDownVerticalOffset:spinnerMode=”dropdown”时,下拉的项目选择窗口在垂直方向相对于Spinner窗口的偏移量
android:dropDownHorizontalOffset:spinnerMode=”dropdown”时,下拉的项目选择窗口在水平方向相对于Spinner窗口的偏移量
android:dropDownSelector:用于设定spinnerMode=”dropdown”时列表选择器的显示效果
android:dropDownWidth:在spinnerMode=”dropdown”时,设定下拉框的宽度
android:gravity:这个属性用于设置当前选择的项目的对齐方式
android:popupBackground:在spinner=”dropdown”时,使用这个属性来设置下拉列表的背景

如果spinner中内容是固定的,那么使用android:entries="@array/shipping_type"表示Spinner的数据集合是从资源数组 shipping_type 中获取的,shipping_type 数组资源定义在values/arrays.xml 中:

<Spinner
            android:id="@+id/spinner"
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:layout_marginLeft="10dp"
            android:layout_toRightOf="@+id/tv_tip"
            android:background="#E5E5E5"
            android:dropDownVerticalOffset="0dp"
            android:spinnerMode="dropdown"
            android:entries="@arrays/shipping_type"
            />

其中 shipping_type

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="shipping_type">
        <item>圆通</item>
        <item>申通</item>
        <item>邮政</item>
    </string-array>
</resources>

样式

增加分割线

该分割线只有是dropdown样式时才会显示
在这里插入图片描述
style 中增加分隔线的样式

<style name="XSpinnerStyle" parent="android:Widget.ListView.DropDown">
        <!-- 分隔线颜色 -->
        <item name="android:divider">#E5E5E5</item>
        <item name="android:dividerHeight">1dp</item>
    </style>

然后在现在 Activity 目前使用的样式中使用

<item name="android:dropDownListViewStyle">@style/XSpinnerStyle</item>

选中和下拉样式

ArrayAdapter<String> starAdapter = new ArrayAdapter<String>(this, R.layout.item_select, starArray);
starAdapter.setDropDownViewResource(R.layout.item_dropdown);

其中 R.layout.item_selectR.layout.item_dropdown是选中和下拉的样式。这是我们自己写的样式。当然也可以用默认的样式。android.R.layout.simple_spinner_item :未展开菜单时Spinner的默认样式android.R.layout.simple_spinner_dropdown_item:展开的时候下拉菜单的样式

如果不设置 starAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)出现的结果就是 下拉样式和 为展开时的样式一样
在这里插入图片描述

弹出框样式

在第一个栗子中,把SpinnerMode属性设置为dialog
在这里插入图片描述

使用自定义的BaseAdapter

效果图:
在这里插入图片描述

布局和之前的相同 activity_test

TestActivity

public class TestActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);

        // 初始化控件
        Spinner spinner  = findViewById(R.id.spinner);
        // 建立数据源
        List<ShippingType> shippingTypes =new ArrayList<ShippingType>();
        shippingTypes.add(new ShippingType("圆通", R.mipmap.yt));
        shippingTypes.add(new ShippingType("申通", R.mipmap.st));
        shippingTypes.add(new ShippingType("邮政", R.mipmap.yz));
        //  建立Adapter绑定数据源
        MyAdapter _MyAdapter=new MyAdapter(this, shippingTypes);
        //绑定Adapter
        spinner.setAdapter(_MyAdapter);
    }
}

ShippingType

public class ShippingType {
    private String shippingName;
    private int shippingIcon;

    public ShippingType(String shippingName, int shippingIcon) {
        this.shippingName = shippingName;
        this.shippingIcon = shippingIcon;
    }

    public String getShippingName() {
        return shippingName;
    }

    public void setShippingName(String shippingName) {
        this.shippingName = shippingName;
    }

    public int getShippingIcon() {
        return shippingIcon;
    }

    public void setShippingIcon(int shippingIcon) {
        this.shippingIcon = shippingIcon;
    }
}

item_custom

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="5dp"
    android:gravity="center">
    <ImageView
        android:id="@+id/img_icon"
        android:layout_width="35dp"
        android:layout_height="35dp"
        android:src="@mipmap/yt"
        android:layout_marginRight="10dp"/>
    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

参考:
android Spinner控件详解
Android中Spinner用法

  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android Spinner 下拉框默认情况下会在 Spinner 控件的下方弹出,覆盖掉部分内容。如果 Spinner 控件在屏幕的底部,下拉框会弹出在 Spinner 控件的上方。可以通过修改 Spinner 的属性来调整下拉框的位置,具体方法如下: 1. 设置 Spinner下拉框弹出位置 可以使用 Spinner 的 `setDropDownVerticalOffset()` 方法来设置下拉框的垂直偏移量,从而改变下拉框的弹出位置。例如: ```java Spinner spinner = findViewById(R.id.spinner); spinner.setDropDownVerticalOffset(100); // 将下拉框往下偏移 100 像素 ``` 2. 自定义下拉框的布局 可以使用自定义布局来替换系统默认的下拉框布局,从而实现自定义的下拉框位置。具体步骤如下: - 创建自定义的下拉框布局文件(例如 `custom_spinner_dropdown_layout.xml`),并在其添加下拉框的内容和样式; - 创建一个 ArrayAdapter 或 CursorAdapter,并在其指定自定义的下拉框布局; - 将 ArrayAdapter 或 CursorAdapter 设置给 Spinner。 示例代码: ```xml <!-- custom_spinner_dropdown_layout.xml --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center_vertical" android:paddingLeft="16dp" android:paddingRight="16dp" android:paddingTop="8dp" android:paddingBottom="8dp"> <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/text" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="16sp" android:textColor="@android:color/black" android:paddingLeft="16dp" android:paddingRight="16dp" android:text="Item" /> </LinearLayout> ``` ```java // 创建 ArrayAdapter 并指定自定义下拉框布局 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.custom_spinner_dropdown_layout, items); adapter.setDropDownViewResource(R.layout.custom_spinner_dropdown_layout); Spinner spinner = findViewById(R.id.spinner); spinner.setAdapter(adapter); ``` 注意:自定义下拉框布局的高度应该设置为 `wrap_content`,以便根据内容自动计算高度。如果设置为固定高度,可能会导致下拉框内容无法完全显示。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值