美文网首页android系统控件程序员前端程序员干货
Spinner(列表选项框)和AutoCompleteTextV

Spinner(列表选项框)和AutoCompleteTextV

作者: 侯蛋蛋_ | 来源:发表于2017-09-17 17:51 被阅读111次

    本节引言:

    本节学习的是一个叫做Spinner的Adapter控件! 应用场景:当我们的app需要用户输入数据时,除了让用户自己打字以外,还有一种比较贴心的设计: 列出一组选项让用户从中挑选,从而方便了我们的用户! 话不多说,开始学习Spinner的基本用法~

    1.相关属性

    android:dropDownHorizontalOffset:设置列表框的水平偏移距离
    android:dropDownVerticalOffset:设置列表框的水平竖直距离
    android:dropDownSelector:列表框被选中时的背景
    android:dropDownWidth:设置下拉列表框的宽度
    android:gravity:设置里面组件的对其方式
    android:popupBackground:设置列表框的背景
    android:prompt:设置对话框模式的列表框的提示信息(标题),只能够引用string.xml 中的资源id,而不能直接写字符串
    android:spinnerMode:列表框的模式,有两个可选值: dialog:对话框风格的窗口 dropdown:下拉菜单风格的窗口(默认)
    可选属性:android:entries:使用数组资源设置下拉列表框的列表项目

    2.使用示例:

    对了,Spinner会默认选中第一个值,就是默认调用spinner.setSection(0), 你可以通过这个设置默认的选中值,另外,会触发一次OnItemSelectedListener 事件,暂时没找到解决方法,下面折衷的处理是:添加一个boolean值,然后设置 为false,在onItemSelected时进行判断,false说明是默认触发的,不做任何操作 将boolean值设置为true;true的话则正常触发事件! 示例中写了两个不同的Spinner,从数据源,列表框风格等进行对比~ 接下来我们来看下

    效果图

    代码实现
    这里依然使用的我们前面的可复用BaseAdapter:
    第一个Spinner的数据源编写:
    res/values下编写一个:myarrays.xml的文件,内容如下:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string-array name="data">
            <item>英勇青铜</item>
            <item>不屈白银</item>
            <item>荣耀黄金</item>
            <item>华贵铂金</item>
            <item>璀璨钻石</item>
            <item>超凡大师</item>
            <item>最强王者</item>
        </string-array>
    </resources>
    

    接着是第二个Spinner的布局:item_spin_hero.xml:

    <?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"
        android:padding="5dp">
    
        <ImageView
            android:id="@+id/img_icon"
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:src="@mipmap/iv_lol_icon1" />
    
        <TextView
            android:id="@+id/txt_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="15dp"
            android:text="德玛西亚"
            android:textSize="16sp" />
    
    </LinearLayout>
    

    再接着编写一个Entitiy实体类:Hero.java:

    /**
     * Created by Jay on 2015/9/24 0024.
     */
    public class Hero {
    
        private int hIcon;
        private String hName;
    
        public Hero() {
        }
    
        public Hero(int hIcon, String hName) {
            this.hIcon = hIcon;
            this.hName = hName;
        }
    
        public int gethIcon() {
            return hIcon;
        }
    
        public String gethName() {
            return hName;
        }
    
        public void sethIcon(int hIcon) {
            this.hIcon = hIcon;
        }
    
        public void sethName(String hName) {
            this.hName = hName;
        }
    }
    

    最后是MainActivity的布局与Java代码部分:
    布局文件:activity_main.xml:

    <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:padding="5dp"
        tools:context=".MainActivity">
        
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="选择您的排位分段"
            android:textColor="#44BDED"
            android:textSize="18sp" />
    
        <Spinner
            android:id="@+id/spin_one"
            android:layout_width="100dp"
            android:layout_height="64dp"
            android:entries="@array/data"
            android:prompt="@string/spin_title"
            android:spinnerMode="dialog" />
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="选择你的拿手英雄~"
            android:textColor="#F5684A"
            android:textSize="18sp" />
    
        <Spinner
            android:id="@+id/spin_two"
            android:layout_width="wrap_content"
            android:layout_height="64dp" />
    
    </LinearLayout>
    

    MainActivity.java:

    public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
    
        private Spinner spin_one;
        private Spinner spin_two;
        private Context mContext;
        //判断是否为刚进去时触发onItemSelected的标志
        private boolean one_selected = false;
        private boolean two_selected = false;
        private ArrayList<Hero> mData = null;
        private BaseAdapter myAdadpter = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mContext = MainActivity.this;
            mData = new ArrayList<Hero>();
            bindViews();
        }
    
    
        private void bindViews() {
            spin_one = (Spinner) findViewById(R.id.spin_one);
            spin_two = (Spinner) findViewById(R.id.spin_two);
    
            mData.add(new Hero(R.mipmap.iv_lol_icon1,"迅捷斥候:提莫(Teemo)"));
            mData.add(new Hero(R.mipmap.iv_lol_icon2,"诺克萨斯之手:德莱厄斯(Darius)"));
            mData.add(new Hero(R.mipmap.iv_lol_icon3,"无极剑圣:易(Yi)"));
            mData.add(new Hero(R.mipmap.iv_lol_icon4,"德莱厄斯:德莱文(Draven)"));
            mData.add(new Hero(R.mipmap.iv_lol_icon5,"德邦总管:赵信(XinZhao)"));
            mData.add(new Hero(R.mipmap.iv_lol_icon6,"狂战士:奥拉夫(Olaf)"));
    
            myAdadpter = new MyAdapter<Hero>(mData,R.layout.item_spin_hero) {
                @Override
                public void bindView(ViewHolder holder, Hero obj) {
                    holder.setImageResource(R.id.img_icon,obj.gethIcon());
                    holder.setText(R.id.txt_name, obj.gethName());
                }
            };
            spin_two.setAdapter(myAdadpter);
            spin_one.setOnItemSelectedListener(this);
            spin_two.setOnItemSelectedListener(this);
    
        }
    
    
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            switch (parent.getId()){
                case R.id.spin_one:
                    if(one_selected){
                        Toast.makeText(mContext,"您的分段是~:" + parent.getItemAtPosition(position).toString(),
                                Toast.LENGTH_SHORT).show();
                    }else one_selected = true;
                    break;
                case R.id.spin_two:
                    if(two_selected){
                        TextView txt_name = (TextView) view.findViewById(R.id.txt_name);
                        Toast.makeText(mContext,"您选择的英雄是~:" + txt_name.getText().toString(),
                                Toast.LENGTH_SHORT).show();
                    }else two_selected = true;
                    break;
            }
        }
    
        @Override
        public void onNothingSelected(AdapterView<?> parent) {
    
        }
    }
    

    3.AutoCompleteTextView(自动完成文本框)的基本使用

    本节继续来学习Adapter类的控件,这次带来的是AutoCompleteTextView(自动完成文本框), 相信细心的你发现了,和Adapter搭边的控件,都可以自己定义item的样式,是吧!

    3.1.相关属性:

    android:completionHint:设置下拉菜单中的提示标题
    android:completionHintView:定义提示视图中显示下拉菜单
    android:completionThreshold:指定用户至少输入多少个字符才会显示提示
    android:dropDownAnchor:设置下拉菜单的定位"锚点"组件,如果没有指定改属性, 将使用该TextView作为定位"锚点"组件
    android:dropDownHeight:设置下拉菜单的高度
    android:dropDownWidth:设置下拉菜单的宽度
    android:dropDownHorizontalOffset:指定下拉菜单与文本之间的水平间距
    android:dropDownVerticalOffset:指定下拉菜单与文本之间的竖直间距
    android:dropDownSelector:设置下拉菜单点击效果
    android:popupBackground:设置下拉菜单的背景

    另外其实还有个MultiAutoCompleteTextView(多提示项的自动完成文本框) 和这个AutoCompleteTextView作用差不多,属性也一样,具体区别在哪里, 我们在下面的代码中来体验~另外这两个都是全词匹配的,比如,小猪猪: 你输入小->会提示小猪猪,但是输入猪猪->却不会提示小猪猪!
    2.代码示例:
    运行效果图

    实现代码
    这里的话就不自定义布局了,直接用ArrayAdapter来实现吧!
    布局文件:activity_main.xml

    <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"
        tools:context=".MainActivity">
    
        <AutoCompleteTextView
            android:id="@+id/atv_content"
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:completionHint="请输入搜索内容"
            android:completionThreshold="1"
            android:dropDownHorizontalOffset="5dp" />
    
        <MultiAutoCompleteTextView
            android:id="@+id/matv_content"
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:completionThreshold="1"
            android:dropDownHorizontalOffset="5dp"
            android:text="" />
        
    </LinearLayout>
    

    MainActivity.java:

    public class MainActivity extends AppCompatActivity {
    
        private AutoCompleteTextView atv_content;
        private MultiAutoCompleteTextView matv_content;
    
        private static final String[] data = new String[]{
                "小猪猪", "小狗狗", "小鸡鸡", "小猫猫", "小咪咪"
        };
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            atv_content = (AutoCompleteTextView) findViewById(R.id.atv_content);
            matv_content = (MultiAutoCompleteTextView) findViewById(R.id.matv_content);
    
    
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.
                    this, android.R.layout.simple_dropdown_item_1line, data);
            atv_content.setAdapter(adapter);
    
            ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_dropdown_item_1line, data);
            matv_content.setAdapter(adapter);
            matv_content.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
        }
    }
    

    部分代码分析:

    • android:completionThreshold="1":这里我们设置了输入一个字就显示提示
    • android:completionHint="请输入搜索内容":这是框框底部显示的文字,如果觉得丑 可以android:completionHintView设置一个View!
    • android:dropDownHorizontalOffset="5dp":设置了水平边距为5dp
    • matv_content.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer()); setTokenizer是为其设置分隔符

    相关文章

      网友评论

        本文标题:Spinner(列表选项框)和AutoCompleteTextV

        本文链接:https://www.haomeiwen.com/subject/uclmsxtx.html