Android入门之利用Spinner实现弹出选择对话框

 更新时间:2022年11月19日 09:19:34   作者:TGITCIC  
这篇文章主要为大家详细介绍了Android里如何巧用Spinner做弹出选择对话框,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解一下

脚本之家 / 编程助手:解决程序员“几乎”所有问题!
脚本之家官方知识库 → 点击立即使用

介绍

Spinner是一种点一下后供用户可以上下选择用的组件。

我们直接来看一个例子说明这个组件是做什么用的。

我们放大点看

我们这次的课程目标就是实现这样的一种点一下然后弹出选择框的样式。

项目结构

随着前几章对Adapter知识的牢固掌握,我们可以看到,这个例子依旧使用的是Adapter设计模式。

  • 我们在项目里放置5个图片用来显示“枪”;
  • 我们做一个ViewBean-GunBean;
  • 我们做一个用于被Adapter渲染用的细节布局item_spin_guns.xml,它的使用是点击下部那个选择你的爱枪这个spinner被点击时,弹出的那个可纵向选择用的视图;

来看代码吧。

前端代码

activity_main.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<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/spinLevel"
        android:layout_width="100dp"
        android:layout_height="64dp"
        android:entries="@array/data"
        android:prompt="@string/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/spinGuns"
        android:layout_width="wrap_content"
        android:layout_height="64dp" />
  
</LinearLayout>

item_spin_guns.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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/gunIcon"
        android:layout_width="64dp"
        android:layout_height="64dp"
        android:src="@drawable/golden_qiang1" />
  
    <TextView
        android:id="@+id/gunName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="15dp"
        android:text="机枪-大链锯"
        android:textSize="16sp" />
  
</LinearLayout>

后端代码

GunBean.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package org.mk.android.demospinneradapter;
  
import java.io.Serializable;
  
public class GunBean implements Serializable {
    private static final long serialVersionUID = 1L;
    private int gunIcon;
    private String gunName="";
  
    public GunBean(){
  
    }
    public GunBean(String gunName,int gunIcon){
        this.gunName=gunName;
        this.gunIcon=gunIcon;
    }
    public int getGunIcon() {
        return gunIcon;
    }
  
    public void setGunIcon(int gunIcon) {
        this.gunIcon = gunIcon;
    }
  
    public String getGunName() {
        return gunName;
    }
  
    public void setGunName(String gunName) {
        this.gunName = gunName;
    }
}

GenericAdapter.java

我们依旧延用我们上一篇在自定义Adapter中制作的那个可接受泛型的Adapter。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
package org.mk.android.demospinneradapter;
  
import android.content.Context;
import android.util.Log;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
  
import java.util.ArrayList;
import java.util.List;
  
public abstract class GenericAdapter<T> extends BaseAdapter {
    private List<T> data;
    private int layoutRes;
  
    public GenericAdapter() {
    }
  
    public GenericAdapter(List<T> data, int layoutRes) {
        this.data = data;
        this.layoutRes = layoutRes;
    }
  
    @Override
    public int getCount() {
        Log.i("app",">>>>>>data.size: "+data.size());
        if(data!=null) {
            return data.size();
        }
        return 0;
    }
  
    @Override
    public T getItem(int position) {
        return data.get(position);
    }
  
    @Override
    public long getItemId(int position) {
        return position;
    }
  
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Log.i("app",">>>>>>into getView");
        ViewHolder holder = ViewHolder.bind(parent.getContext(), convertView, parent, layoutRes
                , position);
        bindView(holder, getItem(position));
        return holder.getItemView();
    }
  
    //添加一个元素
    public void add(T item) {
        if (data == null) {
            data = new ArrayList<>();
        }
        data.add(item);
        notifyDataSetChanged();
    }
  
    //往特定位置,添加一个元素
    public void add(int position,T item){
        if (data == null) {
            data = new ArrayList<>();
        }
        data.add(position, item);
        notifyDataSetChanged();
    }
  
    public void remove(T item) {
        if(data != null) {
            data.remove(item);
        }
        notifyDataSetChanged();
    }
  
    public void remove(int position) {
        if(data != null) {
            data.remove(position);
        }
        notifyDataSetChanged();
    }
  
    public void clear() {
        if(data != null) {
            data.clear();
        }
        notifyDataSetChanged();
    }
  
    public abstract void bindView(ViewHolder holder, T obj);
  
    public static class ViewHolder {
  
        private SparseArray<View> mViews;   //存储ListView 的 item中的View
        private View item;                  //存放convertView
        private int position;               //游标
        private Context context;            //Context上下文
  
        //构造方法,完成相关初始化
        private ViewHolder(Context context, ViewGroup parent, int layoutRes) {
            mViews = new SparseArray<>();
            this.context = context;
            View convertView = LayoutInflater.from(context).inflate(layoutRes, parent,false);
            convertView.setTag(this);
            item = convertView;
        }
        public static ViewHolder bind(Context context, View convertView, ViewGroup parent,
                                      int layoutRes, int position) {
            ViewHolder holder;
            if(convertView == null) {
                holder = new ViewHolder(context, parent, layoutRes);
            } else {
                holder = (ViewHolder) convertView.getTag();
                holder.item = convertView;
            }
            holder.position = position;
            return holder;
        }
        public <T extends View> T getView(int id) {
            T t = (T) mViews.get(id);
            if(t == null) {
                t = (T) item.findViewById(id);
                mViews.put(id, t);
            }
            return t;
        }
        /**
         * 获取当前条目
         */
        public View getItemView() {
            return item;
        }
  
        /**
         * 获取条目位置
         */
        public int getItemPosition() {
            return position;
        }
  
        /**
         * 设置文字
         */
        public ViewHolder setText(int id, CharSequence text) {
            View view = getView(id);
            if(view instanceof TextView) {
                ((TextView) view).setText(text);
            }
            return this;
        }
  
        /**
         * 设置图片
         */
        public ViewHolder setImageResource(int id, int drawableRes) {
            View view = getView(id);
            if(view instanceof ImageView) {
                ((ImageView) view).setImageResource(drawableRes);
            } else {
                view.setBackgroundResource(drawableRes);
            }
            return this;
        }
  
        /**
         * 设置标签
         */
        public ViewHolder setTag(int id, Object obj) {
            getView(id).setTag(obj);
            return this;
        }
  
        public ImageView iconImg;
        public TextView iconText;
    }
}

MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package org.mk.android.demospinneradapter;
  
import androidx.appcompat.app.AppCompatActivity;
  
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Spinner;
import android.widget.TextView;
  
import com.google.android.material.navigation.NavigationBarView;
  
import java.util.ArrayList;
import java.util.List;
  
public class MainActivity extends AppCompatActivity {
    private Spinner spin_one;
    private Spinner spin_two;
    private Context mContext;
    //判断是否为刚进去时触发onItemSelected的标志
    private boolean one_selected = false;
    private boolean two_selected = false;
    private List<GunBean> mData = null;
    private BaseAdapter myAdadpter = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mData = new ArrayList<GunBean>();
        bindViews();
    }
    private void bindViews() {
        spin_one = (Spinner) findViewById(R.id.spinLevel);
        spin_two = (Spinner) findViewById(R.id.spinGuns);
  
        mData.add(new GunBean("ak47",R.drawable.golden_qiang1));
        mData.add(new GunBean("大狙",R.drawable.golden_qiang2));
        mData.add(new GunBean("AK74",R.drawable.golden_qiang3));
        mData.add(new GunBean("不认识",R.drawable.normal_qiang1));
        mData.add(new GunBean("突击步枪",R.drawable.normal_qiang2));
  
  
        myAdadpter = new GenericAdapter<GunBean>(mData,
                R.layout.item_spin_guns) {
            @Override
            public void bindView(ViewHolder holder, GunBean obj) {
                holder.setImageResource(R.id.gunIcon, obj.getGunIcon());
                holder.setText(R.id.gunName, obj.getGunName());
            }
        };
        spin_two.setAdapter(myAdadpter);
        spin_one.setOnItemSelectedListener(new OnItemSelectedListener());
        spin_two.setOnItemSelectedListener(new OnItemSelectedListener());
    }
    private class OnItemSelectedListener implements AdapterView.OnItemSelectedListener{
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            switch (parent.getId()){
                case R.id.spinLevel:
                    if(one_selected){
                        Log.i("app",
                                ">>>>>>您选的级别为:"+parent.getItemAtPosition(position).toString());
                    }else one_selected = true;
                    break;
                case R.id.spinGuns:
                    if(two_selected){
                        TextView gunName =
                                (TextView) view.findViewById(R.id.gunName);
                        Log.i("app",
                                ">>>>>>您选的枪为:"+gunName.getText().toString());
                    }else two_selected = true;
                    break;
            }
        }
  
        @Override
        public void onNothingSelected(AdapterView<?> parent) {
  
        }
    }
}

请自己动手运行一下,试试看效果吧。 

以上就是Android入门之利用Spinner实现弹出选择对话框的详细内容,更多关于Android Spinner选择对话框的资料请关注脚本之家其它相关文章!

蓄力AI

微信公众号搜索 “ 脚本之家 ” ,选择关注

程序猿的那些事、送书等活动等着你

原文链接:https://blog.csdn.net/lifetragedy/article/details/127925432

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!

相关文章

最新评论