0
点赞
收藏
分享

微信扫一扫

Android 中 Spinner下拉框使用


文章目录

  • ​​先用起来​​
  • ​​方法和属性​​
  • ​​样式​​
  • ​​增加分割线​​
  • ​​选中和下拉样式​​
  • ​​弹出框样式​​
  • ​​使用自定义的BaseAdapter​​

先用起来

效果图
Android 中 Spinner下拉框使用_xml

布局页面 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样式时才会显示
Android 中 Spinner下拉框使用_xml_02
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_select​​​ 和 ​​R.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)​​​出现的结果就是 下拉样式和 为展开时的样式一样
Android 中 Spinner下拉框使用_xml_03

弹出框样式

在第一个栗子中,把SpinnerMode属性设置为dialog
Android 中 Spinner下拉框使用_spinner_04

使用自定义的BaseAdapter

效果图:
Android 中 Spinner下拉框使用_android_05

布局和之前的相同 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用法


举报

相关推荐

0 条评论