GVKun编程网logo

安卓Spinner学习(安卓spinner如何使用)

16

想了解安卓Spinner学习的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于安卓spinner如何使用的相关问题,此外,我们还将为您介绍关于AndroidSpinner的ArrayAdapt

想了解安卓Spinner学习的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于安卓spinner如何使用的相关问题,此外,我们还将为您介绍关于Android Spinner的ArrayAdapter和SpinnerAdapter注意事项、Android Spinner重写以支持Spinner本身onClick事件、android Spinner:在spinner中垂直居中文本、Android UI 设计 下拉菜单 Spinner 用法 动态添加删除 Spinner 菜单项的新知识。

本文目录一览:

安卓Spinner学习(安卓spinner如何使用)

安卓Spinner学习(安卓spinner如何使用)

 安卓的spinner也是比较常用的控件,AndroidX包里提供了新的AppCompatSpinner,其实也没什么区别,不过如果打算告别support包的话,还是用这个比较好。

    <androidx.appcompat.widget.AppCompatSpinner
        android:id="@+id/spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />

 使用以上的方式就可以看到可以用的spinner了,然后是添加item。两种方式,一种是在value文件夹新建一个arrays.xml文件,详情见

android Spinner控件详解-最简单的Spinner

如果想要改变下拉框和非下拉的背景样式,设置

        android:background="@drawable/a"
        android:popupBackground="@drawable/b"

值得注意的是,默认的spinner下拉框位置在这spinner的正上方(覆盖),所以为了美观最好设置偏移量。注意偏移量的大小为正才是往下偏移,而且最好设置的大一点。如:
android:dropDownVerticalOffset="100dp"
此外,可能LinearLayout不支持这样弄。

android spinner改变下拉弹出的位置

需要设置分割线参考

spinner添加分割线和改变右侧箭头

需要设置文字居中参考

让Spinner中的文字居中

Android Spinner的ArrayAdapter和SpinnerAdapter注意事项

Android Spinner的ArrayAdapter和SpinnerAdapter注意事项

Android Spinner的ArrayAdapter和SpinnerAdapter注意事项


如图所示:



代码:

package com.example.spinnerdemo;

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.activity_main);

		String[] start = { "北京", "上海", "成都", "其他" };
		String[] target = { "北京", "上海", "成都", "其他" };

		Spinner spinner1 = (Spinner) findViewById(R.id.spinner1);
		spinner1.setAdapter(new MyAdapter1(this,
				android.R.layout.simple_list_item_1, android.R.id.text1, start));

		Spinner spinner2 = (Spinner) findViewById(R.id.spinner2);
		spinner2.setAdapter(new MyAdapter2(this,
				android.R.layout.simple_list_item_1, android.R.id.text1, target));
	}

	private class MyAdapter1 extends ArrayAdapter {

		private LayoutInflater infalter;
		private String[] start;
		private int resource;
		private int textViewResourceId;

		public MyAdapter1(Context context, int resource,
				int textViewResourceId, String[] objects) {
			super(context, resource, textViewResourceId, objects);
			
			this.start = objects;
			this.resource = resource;
			this.textViewResourceId = textViewResourceId;
			
			infalter = LayoutInflater.from(context);
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			if (convertView == null)
				convertView = infalter.inflate(resource, null);
			TextView text = (TextView) convertView
					.findViewById(textViewResourceId);
			text.setText("pos:"+position);
			return convertView;
		}

		@Override
		public int getCount() {
			return start.length;
		}
	}

	private class MyAdapter2 extends ArrayAdapter {

		private LayoutInflater infalter;
		private int resource;
		private int textViewResourceId;

		private String[] target;

		public MyAdapter2(Context context, int resource,
				int textViewResourceId, String[] objects) {
			super(context, resource, textViewResourceId, objects);
			
			this.resource = resource;
			this.textViewResourceId = textViewResourceId;
			target = objects;
			
			infalter = LayoutInflater.from(context);
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			if (convertView == null)
				convertView = infalter.inflate(resource, null);
			TextView text = (TextView) convertView
					.findViewById(textViewResourceId);
			text.setText("选择了:" + target[position]);
			text.setBackgroundColor(Color.GREEN);
			return convertView;
		}

		@Override
		public View getDropDownView(int position, View convertView,
				ViewGroup parent) {
			if (convertView == null)
				convertView = infalter.inflate(
						android.R.layout.simple_list_item_1, null);
			TextView text = (TextView) convertView
					.findViewById(android.R.id.text1);
			text.setText(target[position]);
			text.setBackgroundColor(Color.RED);
			return convertView;
		}

		@Override
		public int getCount() {
			return target.length;
		}
	}
}


布局文件:

<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="horizontal"
    tools:context="com.example.spinnerdemo.MainActivity" >

    <Spinner
        android:id="@+id/spinner1"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Spinner
        android:id="@+id/spinner2"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>


注意事项:

(1)如果只是使用Android Spinner实现一个表现简单的下拉选项,那么可以直截了当的根据布局文件、数据源构造一个完备的Android Spinner,比如:new ArrayAdapter(this,android.R.layout.simple_list_item_1,android.R.id.text1,data);
new出来的,android Spinner下拉列表中的数据和选中框的数据及view完全一致。这也是Android Spinner最常用的使用场景。
(2)在adapter中,getView负责创建Spinner的选择框选中的item的view呈现,即上图中“pos1”和绿色背景的“选择了:成都”这些view,而getDropDownView则创建下拉选项列表中各个子item的view和数据的创建。两者分工不同,在本例中结合最终的View结合spinner1和spinner2所对应的两个不同adapter代码对比。
在MyAdapter1中,没有实现getDropDownView,但是通过MyAdapter1在构造函数时候接收到完整的资源布局文件、数据源,那么Android自动将下拉列表中的数据从构造中获得的数据渲染下拉列表中的数据。但是由于代码重写了getView,那么选中框将根据getView表现。
(3)使用ArrayAdapter作为Spinner的适配器时候,如果在ArrayAdapter中构造时候不传递过去完整的布局文件、数据源,比如这样构造适配器:new MyArrayAdapter(this,-1),并且不在ArrayAdapter内部实现getDropDownView,则会引起Spinner代码崩溃,原因是因为Spinner会自动加载适配器中的默认构造,进而,如果传递过去的是null,则下拉列表无法正确加载,进而导致代码崩溃。

Android Spinner重写以支持Spinner本身onClick事件

Android Spinner重写以支持Spinner本身onClick事件

有个需求,在点击Spinner下拉框时做一些判断,满足条件才弹出下拉框,不满足不弹出,Spinner本身不能设置OnClickListener,只能重写



import android.content.Context;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.MotionEvent;
 
public class ClickableSpinner extends android.support.v7.widget.AppCompatSpinner {

    public ClickableSpinner(Context context) {
        super(context);
    }

    public ClickableSpinner(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public ClickableSpinner(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    private boolean isMoved = false;
    private Point touchedPoint = new Point();

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int x = (int) event.getRawX();
        int y = (int) event.getRawY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN :
                touchedPoint.x = x;
                touchedPoint.y = y;
                break;
            case MotionEvent.ACTION_MOVE :
                isMoved = true;
                break;
            case MotionEvent.ACTION_UP :
                if (isMoved) {
                    // 从上向下滑动
                    if (y - touchedPoint.y > 20) {
                    }
                    // 从下向上滑动
                    else if (touchedPoint.y - y > 20) {
                    }
                    // 滑动幅度小时,当作点击事件
                    else {
                        onClick();
                    }
                    isMoved = false;
                } else {
                    onClick();
                }
                break;
            default :
                break;
        }
        return true;
    }

    private void onClick() {
        if (OnClickListener != null && isEnabled()) {
            OnClickListener.onClick();
        }
    }

    private OnClickListener OnClickListener;

    /**
     * 注册自定义的点击事件监听
     *
     * @param
     */
    public void setOnClickListener(OnClickListener OnClickListener) {
        this.OnClickListener = OnClickListener;
    }

    /**
     * 自定义点击事件监听.
     */
    public interface OnClickListener {
        public void onClick();
    }
}

使用:

 spinner.setOnClickListener(new ClickableSpinner.OnClickListener() {
                        @Override
                        public void onClick() {
                            if(boolean){
                                spinner.performClick();
                            }
                      
                        }
                    });

 

子项选择监听依然是:

setOnItemSelectedListener

android Spinner:在spinner中垂直居中文本

android Spinner:在spinner中垂直居中文本

我需要这些微调器垂直居中文本.我在Spinner xml定义中尝试过这样的东西:
<Spinner
    android:id="@+id/dir_spn"
    android:layout_gravity="center_vertical"
    android:gravity="center_vertical"
    android:layout_weight="1"/>

我尝试构建自定义下拉布局:

<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"android:singleLine="true"
    android:layout_width="match_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:ellipsize="marquee" />

styles.xml:

<resources>
<style name="SpinnerDropDownItem">
    <item name="android:gravity">center_vertical</item>
    <item name="android:layout_gravity">center_vertical</item>
    <item name="android:textColor">?android:attr/textColorPrimary</item>
    <item name="android:textColorHighlight">#FFFF9200</item>
    <item name="android:textColorHint">?android:attr/textColorHint</item>
    <item name="android:textColorLink">#5C5CFF</item>
    <item name="android:textSize">16sp</item>
    <item name="android:textStyle">normal</item>
</style>
</resources>

适配器下拉集:

adapter.setDropDownViewResource(R.layout.spinner_dropdown_item);

如何让Spinner文本垂直居中?

编辑:
值得一提的是,活动以清单为主题:

<resources>
<style name="SpeakNSpell" parent="@android:style/Theme">
    <item name="android:minHeight">68sp</item>
</style>
</resources>

这使得所有视图至少高68sp.这是否会影响Spinner内部的文本?

解决方法

改写

您似乎想要在项目资源中垂直居中,如下所示,但您的代码示例以下拉菜单为目标……

顶级Spinner是默认的android simple_spinner_item布局,底部是相同的但添加了android:gravity =“center_vertical”.

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ellipsize="marquee"
    android:gravity="center_vertical"
    android:singleLine="true" />

你可以看到我使用你的主题与大minHeight.以下是在适配器中使用此布局的基本示例:

Spinner spinner = (Spinner) findViewById(R.id.spinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.spinner_item,list);
// set whatever dropdown resource you want
spinner.setAdapter(adapter);

我假设你想要从你的图片中心“CASH”,“选择产品”等,让我知道你在哪里尝试做别的事!

Android UI 设计 下拉菜单 Spinner 用法 动态添加删除 Spinner 菜单项

Android UI 设计 下拉菜单 Spinner 用法 动态添加删除 Spinner 菜单项

Spinner 是一种下接菜单,类似 HTML 中的 select 标签,点击后弹出一个对话框,显示几个供选择的选项,手机屏幕大小有限,如果都用 RadioGroup 单选按钮,会占用很大的空间。今天的例子最终效果如下图:

Spinner 需要绑定一个适配器 ArrayAdapter,将菜单项放在适配器中,添加删除菜单项只需要调用适配器的 add,remove 方法即可。
布局 XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<EditText android:id="@+id/et"
	android:layout_width="fill_parent"
    android:layout_height="wrap_content"
/>
<Button android:id="@+id/add"
	android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="添加"
/>
<Button android:id="@+id/remove"
	android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="删除"
/>
<Spinner android:id="@+id/sp"
	android:layout_width="fill_parent"
	android:layout_height="wrap_content"
/>
</LinearLayout>

一个 EditText,用于定义需要添加或删除的菜单项,一个添加,一个删除按钮,还有一个就是 Spinner

在 strings.xml 中定义一个初始的数组,就是刚开始时 Spinner 显示的项目,当然,也可以直接在 JAVA 代码中定义

    <string-array name="action">
    	<item>吃饭</item>
    	<item>睡觉</item>
    	<item>上网</item>
    </string-array>

JAVA 程序代码:
package com.pocketdigi.spanner;
 
import java.util.ArrayList;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
 
public class main extends Activity {
    /** Called when the activity is first created. */
	EditText et;
	Button add,remove;
	Spinner sp;
	ArrayList<String> list=new ArrayList<String>();
	ArrayAdapter<String> adapter;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        et=(EditText)findViewById(R.id.et);
        add=(Button)findViewById(R.id.add);
        remove=(Button)findViewById(R.id.remove);
        sp=(Spinner)findViewById(R.id.sp);
        //获取相应对象
        String[]  ls=getResources().getStringArray(R.array.action);
        //获取XML中定义的数组
        for(int i=0;i<ls.length;i++){
        	list.add(ls[i]);
        }
        //把数组导入到ArrayList中
        adapter=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,list);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        //设置下拉菜单的风格
        sp.setAdapter(adapter);
        //绑定适配器
        sp.setPrompt("标题栏");
        //设置对话框标题栏
        add.setOnClickListener(new OnClickListener(){//添加按钮监听器
 
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				adapter.add(et.getText().toString());
				//添加输入的项 ,add后自动调用notifyDataSetChanged()
				//如果需要指定位置,使用insert(String s, int index)方法
				setTitle(String.valueOf(list.size()));
				//在标题输出添加后list的大小
			}
 
        });
        remove.setOnClickListener(new OnClickListener(){//删除按钮监听器
 
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				adapter.remove(sp.getSelectedItem().toString());
				//删除当前选中项,remove后自动调用notifyDataSetChanged()
				setTitle(String.valueOf(list.size()));
			}
 
        });
 
    }
}

源代码打包下载:
Spinner 范例 (498)

文章出处:http://www.pocketdigi.com/20100810/20.html

我们今天的关于安卓Spinner学习安卓spinner如何使用的分享就到这里,谢谢您的阅读,如果想了解更多关于Android Spinner的ArrayAdapter和SpinnerAdapter注意事项、Android Spinner重写以支持Spinner本身onClick事件、android Spinner:在spinner中垂直居中文本、Android UI 设计 下拉菜单 Spinner 用法 动态添加删除 Spinner 菜单项的相关信息,可以在本站进行搜索。

本文标签: