Android入門之利用Spinner實(shí)現(xiàn)彈出選擇對(duì)話框
介紹
Spinner是一種點(diǎn)一下后供用戶可以上下選擇用的組件。
我們直接來(lái)看一個(gè)例子說(shuō)明這個(gè)組件是做什么用的。
我們放大點(diǎn)看
我們這次的課程目標(biāo)就是實(shí)現(xiàn)這樣的一種點(diǎn)一下然后彈出選擇框的樣式。
項(xiàng)目結(jié)構(gòu)
隨著前幾章對(duì)Adapter知識(shí)的牢固掌握,我們可以看到,這個(gè)例子依舊使用的是Adapter設(shè)計(jì)模式。
- 我們?cè)陧?xiàng)目里放置5個(gè)圖片用來(lái)顯示“槍”;
- 我們做一個(gè)ViewBean-GunBean;
- 我們做一個(gè)用于被Adapter渲染用的細(xì)節(jié)布局item_spin_guns.xml,它的使用是點(diǎn)擊下部那個(gè)選擇你的愛(ài)槍這個(gè)spinner被點(diǎn)擊時(shí),彈出的那個(gè)可縱向選擇用的視圖;
來(lái)看代碼吧。
前端代碼
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="選擇武器等級(jí)" 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="選擇你的愛(ài)槍" 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
<?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="機(jī)槍-大鏈鋸" android:textSize="16sp" /> </LinearLayout>
后端代碼
GunBean.java
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中制作的那個(gè)可接受泛型的Adapter。
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(); } //添加一個(gè)元素 public void add(T item) { if (data == null) { data = new ArrayList<>(); } data.add(item); notifyDataSetChanged(); } //往特定位置,添加一個(gè)元素 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; //存儲(chǔ)ListView 的 item中的View private View item; //存放convertView private int position; //游標(biāo) private Context context; //Context上下文 //構(gòu)造方法,完成相關(guān)初始化 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; } /** * 獲取當(dāng)前條目 */ public View getItemView() { return item; } /** * 獲取條目位置 */ public int getItemPosition() { return position; } /** * 設(shè)置文字 */ public ViewHolder setText(int id, CharSequence text) { View view = getView(id); if(view instanceof TextView) { ((TextView) view).setText(text); } return this; } /** * 設(shè)置圖片 */ 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; } /** * 設(shè)置標(biāo)簽 */ public ViewHolder setTag(int id, Object obj) { getView(id).setTag(obj); return this; } public ImageView iconImg; public TextView iconText; } }
MainActivity.java
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; //判斷是否為剛進(jìn)去時(shí)觸發(fā)onItemSelected的標(biāo)志 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èn)識(shí)",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", ">>>>>>您選的級(jí)別為:"+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) { } } }
請(qǐng)自己動(dòng)手運(yùn)行一下,試試看效果吧。
以上就是Android入門之利用Spinner實(shí)現(xiàn)彈出選擇對(duì)話框的詳細(xì)內(nèi)容,更多關(guān)于Android Spinner選擇對(duì)話框的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Android入門之彈出式對(duì)話框的實(shí)現(xiàn)
- Android對(duì)話框使用方法詳解
- Android自定義對(duì)話框的簡(jiǎn)單實(shí)現(xiàn)
- 五分了解Android?Progress?Bar進(jìn)度條加載
- Android開(kāi)發(fā)基礎(chǔ)使用ProgressBar加載進(jìn)度條示例
- Android自定義View實(shí)現(xiàn)進(jìn)度條動(dòng)畫
- Android實(shí)現(xiàn)簡(jiǎn)單實(shí)用的垂直進(jìn)度條
- android實(shí)現(xiàn)簡(jiǎn)單進(jìn)度條ProgressBar效果
- Jetpack Compose實(shí)現(xiàn)對(duì)話框和進(jìn)度條實(shí)例解析
相關(guān)文章
Android控件之SlidingDrawer(滑動(dòng)式抽屜)詳解與實(shí)例分享
這篇文章詳細(xì)介紹了Android控件之SlidingDrawer(滑動(dòng)式抽屜)與實(shí)例,有需要的朋友可以參考一下2013-10-10Flutter實(shí)現(xiàn)自定義篩選框的示例代碼
本文主要介紹了Flutter實(shí)現(xiàn)自定義篩選框的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07Anroid四大組件service之本地服務(wù)的示例代碼
本篇文章主要介紹了Anroid四大組件service之本地服務(wù)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10android ScrollView實(shí)現(xiàn)下拉放大頭部圖片
這篇文章主要為大家詳細(xì)介紹了android ScrollView實(shí)現(xiàn)下拉放大頭部圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12Android recyclerview實(shí)現(xiàn)縱向虛線時(shí)間軸的示例代碼
本文主要介紹了Android recyclerview實(shí)現(xiàn)縱向虛線時(shí)間軸的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07Android中SeekBar和RatingBar用法實(shí)例分析
這篇文章主要介紹了Android中SeekBar和RatingBar用法,結(jié)合實(shí)例形式分析了SeekBar和RatingBar的功能、定義與簡(jiǎn)單使用方法,需要的朋友可以參考下2016-06-06Android 實(shí)現(xiàn)自定義圓形進(jìn)度條的功能
這篇文章主要介紹了Android 實(shí)現(xiàn)自定義圓形進(jìn)度條的功能的相關(guān)資料,開(kāi)發(fā)Android應(yīng)用的朋友肯定對(duì)自定義View不陌生,很多都有重新寫的,這里就對(duì)實(shí)現(xiàn)圓形進(jìn)度條介紹下,需要的朋友可以參考下2016-11-11