Android入門(mén)之利用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入門(mén)之利用Spinner實(shí)現(xiàn)彈出選擇對(duì)話框的詳細(xì)內(nèi)容,更多關(guān)于Android Spinner選擇對(duì)話框的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Android入門(mén)之彈出式對(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)畫(huà)
- 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-10
Flutter實(shí)現(xiàn)自定義篩選框的示例代碼
本文主要介紹了Flutter實(shí)現(xiàn)自定義篩選框的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07
Anroid四大組件service之本地服務(wù)的示例代碼
本篇文章主要介紹了Anroid四大組件service之本地服務(wù)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
android ScrollView實(shí)現(xiàn)下拉放大頭部圖片
這篇文章主要為大家詳細(xì)介紹了android ScrollView實(shí)現(xiàn)下拉放大頭部圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
Android 高仿斗魚(yú)滑動(dòng)驗(yàn)證碼
這篇文章主要介紹了Android 高仿斗魚(yú)滑動(dòng)驗(yàn)證碼的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-11-11
Android recyclerview實(shí)現(xiàn)縱向虛線時(shí)間軸的示例代碼
本文主要介紹了Android recyclerview實(shí)現(xiàn)縱向虛線時(shí)間軸的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
Android中SeekBar和RatingBar用法實(shí)例分析
這篇文章主要介紹了Android中SeekBar和RatingBar用法,結(jié)合實(shí)例形式分析了SeekBar和RatingBar的功能、定義與簡(jiǎn)單使用方法,需要的朋友可以參考下2016-06-06
Android 實(shí)現(xiàn)自定義圓形進(jìn)度條的功能
這篇文章主要介紹了Android 實(shí)現(xiàn)自定義圓形進(jìn)度條的功能的相關(guān)資料,開(kāi)發(fā)Android應(yīng)用的朋友肯定對(duì)自定義View不陌生,很多都有重新寫(xiě)的,這里就對(duì)實(shí)現(xiàn)圓形進(jìn)度條介紹下,需要的朋友可以參考下2016-11-11

