轻松自定义spinner样式

PS:看了9年的小说,自己开始动手写了一本,请各位猿们动动手指,点击下,有起点账号的可以收藏下!!《武意长存》


还记得以前有过想自定义spinner样式,但上网一搜都是让你使用popupwindow去代替spinner,此时有时根本不用那么麻烦。接下来便跟大家一起来看看如何自定义spinner。

首先先看下效果图


接下来贴上几个布局

1. activity_main.xml

<span style="white-space:pre">	</span><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    	<span style="white-space:pre">	</span>xmlns:tools="http://schemas.android.com/tools"
   	 	android:layout_width="match_parent"
    	<span style="white-space:pre">	</span>android:layout_height="match_parent" >

    	<span style="white-space:pre">	</span><Spinner
        	<span style="white-space:pre">	</span>android:id="@+id/sp"
        	<span style="white-space:pre">	</span>android:layout_width="wrap_content"
        	<span style="white-space:pre">	</span>android:layout_height="wrap_content"
       	<span style="white-space:pre">		</span>android:layout_centerInParent="true" />

<span style="white-space:pre">	</span></RelativeLayout>
很简单,就一个Spinner控件

2. simple_spinner_item.xml(选中item后显示的布局)

<?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="wrap_content"
    android:background="@android:color/white"
    android:orientation="horizontal" >
    
    <ImageView 
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_gravity="center_vertical"
        android:src="@drawable/ic_launcher"/>

    <TextView
        android:id="@id/tv_spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="?android:attr/spinnerItemStyle"
        android:ellipsize="marquee"
        android:singleLine="true"
        android:gravity="right"
        android:textSize="14sp"/>

</LinearLayout>

3.simple_spinner_dropdown_item.xml(下来的item布局)

<?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:orientation="horizontal" >
    
    <ImageView 
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_gravity="center_vertical"
        android:src="@drawable/ic_launcher"/>

    <TextView
        android:id="@id/tv_spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ellipsize="marquee"
        android:paddingTop="5dp"
        android:paddingBottom="5dp"
        android:paddingLeft="8dp"
        android:textSize="14sp"
        android:singleLine="true" />

</LinearLayout>
这里展示的布局和下拉item显示的布局基本一样,当然你可以自定义成你想要展示的布局。

开始上代码

public class MainActivity extends Activity {
	private Spinner spinner;
	private ArrayAdapter<String> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        spinner = (Spinner) findViewById(R.id.sp);
        
        adapter = new ArrayAdapter<String>(this,
				R.layout.simple_spinner_item, R.id.tv_spinner);

        adapter
				.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);
        adapter.add("text1");
        adapter.add("text2");
        adapter.add("text3");
        adapter.add("text3");

		spinner.setAdapter(adapter);
    }

}

就是如此简单,最关键的就是要保持simple_spinner_item.xml和simple_spinner_dropdown_item.xml两个布局中用于展示文字所用的id是一致的。

那如何保证两个textview的id一致呢?

只需在values目录下新建个ids.xml文件,在里面先声明变可以了

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="tv_spinner" type="id"></item>
</resources>

至于我是如何知道的,我想不用说大家都猜得到,看源码呗,源码面前了无秘密。只需要跟进ArrayAdapter里面查看源码,便可知道若是我们没指定textview的id,它会使用默认的id去获取textview,也就是ArrayAdapter默认布局里textview的id。若是指定了id,在ArrayAdapter里面会用同一个id去获取两个布局中的textview,因此默认显示和下拉的item里用于展示文字的textview必须是相同的id,否则肯定报错。

  当然啦,这种自定义对于一些简单的要求还是很方便的,当若是传入的数据是一些比较复杂的对象类型,且要展示的不止一个数据,那就不适合了。

  你或许会有疑问,竟然这样那我直接都使用popupwind自定义不就好了,干嘛还要这么折腾。其实主要是使用spinner你不用再自己去控制弹出的选择框要在展示的文本下方还是上方,系统已经帮你处理了,可以省去很多麻烦。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值