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

目录
  • 介绍
  • 项目结构
  • 前端代码
    • activity_main.xml
    • item_spin_guns.xml
  • 后端代码
    • GunBean.java
    • GenericAdapter.java
    • MainActivity.java

介绍

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

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

我们放大点看

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

项目结构

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

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

来看代码吧。

前端代码

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/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

<?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

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。

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

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

(0)

相关推荐

  • 五分了解Android Progress Bar进度条加载

    目录 1.前言 2.ProgressBar 3.SeekBar 4.结尾 1.前言 最近在开发中,同事对于android.widget下的控件一知半解,又恰好那天用到了Seekbar,想了想,那就从Seekbar's father ProgressBar 来说说android.widget下的常用控件和常用用法吧.后面也会根据这些控件来进行仿写.扩展,做一些高度自定义的View啦.如果写的不好,或者有错误之处,恳请在评论.私信.邮箱指出,万分感谢 2.ProgressBar A user int

  • Android对话框使用方法详解

    对话框(Dialog)是Android系统在Activity或者其他组件运行过程中提供的一种提示机制.它可以帮助应用完成一些必要的提示功能,同时提供一些与用户交互的功能. 对话框分为很多种,下面将一一介绍. 1.提示对话框 Android系统提供的对话框父类为Dialog, 里面并没有实现对话框的具体类型,比如单选.多选.列表等对话框,仅提供一个框架和规范.系统为开发者提供了一个 多功能的对话框类AlertDialog, 里面封装了各种对话框的样式,开发者只须提供相应的显示数据和按键的响应监听就

  • Android自定义对话框的简单实现

    本文实例为大家分享了Android自定义对话框的具体实现代码,供大家参考,具体内容如下 1.定义对话框的布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="match_parent&quo

  • android实现简单进度条ProgressBar效果

    本文实例为大家分享了android实现简单进度条ProgressBar的具体代码,供大家参考,具体内容如下 记录一下今天学习的进度条ProgressBar 1.在布局文件中添加ProgressBar <ProgressBar         android:id="@+id/progressbar"         android:layout_width="match_parent"         android:layout_height="w

  • Android实现简单实用的垂直进度条

    本文实例为大家分享了Android实现简单垂直进度条的具体代码,供大家参考,具体内容如下 代码注释特别清晰,就不多解释了 支持属性: progress_radius     进度条圆角大小 progress_border_enable  进度条是否有边框 progress_gradient_enable 进度条颜色是否渐变 progress_start_color     从上到下进度条开始的渐变色 progress_end_color    从上到下进度条结束的渐变色 progress_sol

  • Android自定义View实现进度条动画

    本文实例为大家分享了Android自定义View实现进度条动画的具体代码,供大家参考,具体内容如下 控件效果 原理: 控制代码/ /更新进度值 val mHandler = object : Handler() {         override fun handleMessage(msg: Message?) {             progressView.setCurrentProgress(progress1.toFloat())         }     } //开启动画,更新

  • Android开发基础使用ProgressBar加载进度条示例

    目录 前言 使用方法 总结 前言 之前我们用过WebView类,打开网页时就会出现加载网页的情况,为了让我们直观的感受到网页加载到什么程度而不是白白干等着空白页,于是加载进度条就是一个很好的展示方式,而通常情况下,当我们的数据未加载完成时就会去使用进度条,而ProgressBar就是用于界面上显示进度条的,下面让我们看看这个控件的使用方法. 使用方法 首先我们将ProgressBar控件加到布局中: <?xml version="1.0" encoding="utf-8

  • Android仿QQ消息提示实现弹出式对话框

    本文在<7种形式的Android Dialog使用实例>在这篇文章的基础进行学习,具体内容如下 1.概述 android原生控件向来以丑著称(新推出的Material Design当另说),因此几乎所有的应用都会特殊定制自己的UI样式.而其中弹出式提示框的定制尤为常见,本篇我们将从模仿QQ退出提示框来看一下常见的几种自定义提示框的实现方式. 这里使用的几种弹出框实现方法概括为以下几种: 自定义Dialog 自定义PopupWindow 自定义Layout View Activity的Dialo

  • Android控件BottomSheet实现底边弹出选择列表

    底边弹出一个选择列表这是一个比较常用的选择条件或跳转的很好的方法,可以很好的隐藏各个选项.在需要使用时在底边弹出.而BottomSheet就是这样的一个控件. 使用 1.导入build compile 'com.cocosw:bottomsheet:1.3.0' 2.在res/values/colors.xml文件中添加以下代码: <!--首页item文字颜色--> <color name="colorSubtitle">#999</color> &

  • Android使用Activity实现从底部弹出菜单或窗口的方法

    本文实例讲述了Android使用Activity实现从底部弹出菜单或窗口的方法.分享给大家供大家参考,具体如下: 这里使用activity实现弹出滑动窗口或菜单,主要是使用了一些设置activity的样式来实现弹出窗口和滑动效果,实现如下: 第一步:设计要弹出窗口的xml布局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://sche

  • 利用BootStrap弹出二级对话框的简单实现方法

    弹出二级对话框,即在对话框的基础上再弹出一个对话框.这对于CRM管理类系统来说应用场景很常见.看到网上有关于实现二级弹出框的方法,需要在一级对话框页面上添加不少css样式.其实,完全可以不用这么麻烦. 利用bootstrap实现二级对话框很简单,只需要在主页面上添加两个含有class="modal"的DIV标签.如下面代码: <!DOCTYPE html> <html> <head> <title></title> <m

  • Android 关机弹出选择菜单的深入解析

    在Android系统中,长按Power键默认会弹出对话框让你选择"飞行模式","静音","关机"等功能.这些功能对于手机非常适用,但是对于机顶盒产品就没有什么必要了.本文简单介绍一下怎样定制关机界面.我的目标是长按Power键,将会关机,弹出"设备将要关机"选择对话框.如果可以选择"是"关机,和"否"返回系统.弹出对话框的代码位于:frameworks\policies\base\pho

  • Android实现底部弹出的对话框功能

    环境: 主机:WIN10 开发环境:Android Studio 2.2 Preview 3 说明: 两种方法实现底部弹出的对话框: Dialog DialogFragment 推荐用DialogFragment 效果图: 布局文件dialog_select_call.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schema

  • android 点击EditText始终不弹出软件键盘实现代码

    android  点击EditText始终不弹出软件键盘 场景描述:正常情况下,当点击EditText时,软键盘会弹出来.现在的要求是当点击EditText时,弹日期选择对话框,选择的结果显示在EditText上.若不处理,当点击EditText时,软键盘和对话框都会弹出,显然用户会感觉到不爽. 解决办法,当点击EditText时: 1.存储当前的输入类型 2.设置输入类型为InputType.TYPE_NULL,禁止手机软键盘 3.还原原来的输入类型,因为这次操作完,还要允许用户修改. 4.弹

  • Android仿QQ长按删除弹出框功能示例

    废话不说,先看一下效果图,如果大家感觉不错,请参考实现代码: 对于列表来说,如果想操作某个列表项,一般会采用长按弹出菜单的形式,默认的上下文菜单比较难看,而QQ的上下文菜单就人性化多了,整个菜单给用户一种气泡弹出的感觉,而且会显示在手指按下的位置,而技术实现我之前是使用popupWindow和RecyclerView实现的,上面一个RecyclerView,下面一个小箭头ImageView,但后来发现没有必要,而且可定制化也不高,还是使用多个TextView更好一点. 我封装了一下,只需要一个P

  • Android PopupWindow实现微信右上角的弹出菜单

    日常开发过程中对于PopupWindown的使用也是比较多的.这里给大家展示一下PopupWindow的使用. 修改activity_main.xml布局: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="matc

  • Android仿微信网络加载弹出框

    本文实例为大家分享了Android仿微信网络加载弹出框的具体代码,供大家参考,具体内容如下 没有饿了么的动画效果好看,但是,特别适用,拿来就用! 看一下效果图 图片素材 好了,其实很简单,就是一个自定义Dialog的控件而已 1. 自定义view的style样式 <resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.L

随机推荐