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选择对话框的资料请关注脚本之家其它相关文章!

微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!
相关文章
Android控件之SlidingDrawer(滑动式抽屉)详解与实例分享
这篇文章详细介绍了Android控件之SlidingDrawer(滑动式抽屉)与实例,有需要的朋友可以参考一下2013-10-10Android recyclerview实现纵向虚线时间轴的示例代码
本文主要介绍了Android recyclerview实现纵向虚线时间轴的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2021-07-07Android中SeekBar和RatingBar用法实例分析
这篇文章主要介绍了Android中SeekBar和RatingBar用法,结合实例形式分析了SeekBar和RatingBar的功能、定义与简单使用方法,需要的朋友可以参考下2016-06-06
最新评论