Android组件的使用:AutoCompleteTextView(自动完成提示文本)、Spinner(下拉列表)
1、AutoCompleteTextView
1.1、
1)、 新建一个布局文件autocompletetextview_layout.xml文件,代码如下:2)、 新建一个arrays.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="vertical" > <AutoCompleteTextView android:id="@+id/actv_1" android:layout_width="match_parent" android:layout_height="wrap_content" android:completionThreshold="1"/> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="s_stuname"> <item>z张三</item> <item>l李四</item> <item>w王五</item> <item>z赵六</item> </string-array> </resources>
3)、 新建一个类AutoCompleteTextViewDemoActivity 继承Activity,并覆写onCreate()方法,代码如下:package com.example.autocompletetextviewdemo; import android.app.Activity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; public class AutoCompleteTextViewDemoActivity extends Activity { //声明一个AutoCompleteTextView对象 private AutoCompleteTextView actv_1 = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //初始化布局管理器 setContentView(R.layout.activity_main); //初始化AutoCompleteTextView组件 actv_1 = (AutoCompleteTextView)super.findViewById(R.id.actv_1); //得到arrays.xml中的数组 String str[] = this.getResources().getStringArray(R.array.stu_arr); //借助ArrayAdapter类把数组加载到AutoCompleteTextView中 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,str); //设置适配器 actv_1.setAdapter(adapter); } }
4)、 在文本框中输入z字母,运行效果提示为:
1.2、
1)、新建一个文件autocompletetextview_extra_layout.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="vertical" > <TextView android:id="@+id/tv_showactvitem" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>
2)、通过LayoutInflater类把数组中的数据加载在autocompletetextview_extra_layout.xml中,然后再把整个文件中的内容加载到AutoCompleteTextView中去。
AutoCompleteTextViewDemoActivity 类:
package com.example.basiccomponent2; import android.app.Activity; import android.os.Bundle; import android.widget.AutoCompleteTextView; import com.example.adapter.ACTVArrayAdapter; public class AutoCompleteTextViewDemoActivity extends Activity { private AutoCompleteTextView actv_showinfo = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.autocompletetextview_layout); //获得AutoCompleteTextView组件id actv_showinfo = (AutoCompleteTextView) super.findViewById(R.id.actv_showinfo); //得到数组数据 String str[] = getResources().getStringArray(R.array.s_stuname); /*实例化自定义Adapter, * Context context:第一个参数表示上下文 * int resource:表示新建的autocompletetextview_extra_layout.xml文件 * int textviewResourceId:表示新建的autocompletetextview_extra_layout.xml文件中的TextView组件id * Object objects[]:表示要传入的数组数据 */ ACTVArrayAdapter adapter = new ACTVArrayAdapter(AutoCompleteTextViewDemoActivity.this, R.layout.autocompletetextview_extra_layout,R.id.tv_showactvitem,str); //设置AutoCompleteTextView组件的id的适配器 actv_showinfo.setAdapter(adapter); } }
3)、新建一个Adapter类。package com.example.adapter; import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextView; import com.example.basiccomponent2.R; public class ACTVArrayAdapter extends ArrayAdapter { private Context context;//表示上下文,即要传过来的Activity类 private int resource; //表示资源文件,即要传入的新建的xml文件 private int textViewResourceId;//表示资源文件中的组件id,即要传入的新建的xml文件中组件的id private Object str[]; //表示要传过来的数组, private LayoutInflater inflater;//表示要把xml中的数据要加载到AutoCompleteTextView中借助的类。 public ACTVArrayAdapter(Context context, int resource, int textViewResourceId, Object[] objects) { super(context, resource, textViewResourceId, objects); this.context = context; this.resource = resource; this.textViewResourceId=textViewResourceId; this.str = objects; inflater = LayoutInflater.from(context);//实例化LayoutInflater } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { // 把指定的布局文件转换成view convertView = inflater.inflate(resource, null); } //传过来的资源文件中的组件id,通过TextView来接收 TextView tv_item = (TextView) convertView.findViewById(textViewResourceId); int p = position%str.length;//防止数组越界 //把数组中的数据设置到autocompletetextview_extra_layout.xml中的TextView中, //然后再加载到AutoCompleteTextView组件中 tv_item.setText(""+str[p]); return super.getView(position, convertView, parent); } }
4)、运行效果:
1.3、
1)、如果要在文字的前面加入图片,则需要定义一个自己的Adapter继承ArrayAdapter类,并覆写构造方法和getView()方法,
在之前的自定义ACTVArrayAdapter 类中加载的AutoCompleteTextView组件中的数据前加入图片,
需要在autocompletetextview_extra_layout.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="vertical" > <ImageView android:id="@+id/iv_shouwactvitemimage" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@+id/tv_showactvitem" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>
2)、 在ACTVArrayAdapter中添加图片id信息,并加载到AutoCompleteTextView中。
//定义一个图片id数组用于保存图片id int icon[] = { R.drawable.d1, R.drawable.d2, R.drawable.d3 };
完整代码:
package com.example.adapter; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; import com.example.basiccomponent2.R; public class ACTVArrayAdapter extends ArrayAdapter { private Context context;//表示上下文,即要传过来的Activity类 private int resource; //表示资源文件,即要传入的新建的xml文件 private int textViewResourceId;//表示资源文件中的组件id,即要传入的新建的xml文件中组件的id private Object str[]; //表示要传过来的数组, private LayoutInflater inflater;//表示要把xml中的数据要加载到AutoCompleteTextView中借助的类。 //定义一个图片id数组用于保存图片id int icon[] = { R.drawable.d1, R.drawable.d2, R.drawable.d3 }; public ACTVArrayAdapter(Context context, int resource, int textViewResourceId, Object[] objects) { super(context, resource, textViewResourceId, objects); this.context = context; this.resource = resource; this.textViewResourceId=textViewResourceId; this.str = objects; inflater = LayoutInflater.from(context);//实例化LayoutInflater } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { // 把指定的布局文件转换成view convertView = inflater.inflate(resource, null); } //传过来的资源文件中的组件id,通过TextView来接收 TextView tv_item = (TextView) convertView.findViewById(textViewResourceId); int p = position%str.length;//防止数组越界 //把数组中的数据设置到autocompletetextview_extra_layout.xml中的TextView中, //然后再加载到AutoCompleteTextView组件中 tv_item.setText(""+str[p]); //获得autocompletetextview_extra_layout.xml中的ImageView组件id ImageView iv_item =(ImageView)convertView.findViewById(R.id.iv_shouwactvitemimage); //防止数组越界 int i = position%icon.length; //把图片加载到ImageView中 iv_item.setImageResource(icon[i]); return super.getView(position, convertView, parent); } }
3)、运行效果:
2、Spinner的使用:
2.1、
1)、新建一个布局文件spinner_layout.xml文件,添加一个Spinner控件,只要在组件中添加一个属性android:entries="@array/资源文件中的名字"代码如下:
2)、 定义一个资源文件arrays.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="vertical" > -->设置布局管理器中的内容为垂直显示 <!-- Spinner组件 --> <Spinner -->定义Spinner控件 android:id="@+id/s_stu_name" -->设置组件id android:layout_width="match_parent" -->设置组件宽度为父容器宽度 android:layout_height="wrap_content" -->设置组件高度为包裹内容高度 android:entries="@array/s_stuname"/> -->设置Spinner下拉列表内容,表示从arrays.xml中读取, </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="s_stuname"> -->定义数组,标签名必须为string-array <item>张三</item> <item>李四</item> <item>王五</item> <item>赵六</item> </string-array> </resources>
3)、 定义SpinnerDemoActivity类并设置布局管理器,代码如下:package com.example.basiccomponent2; import android.app.Activity; import android.os.Bundle; public class SpinnerDemoActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.spinner_layout);//设置布局管理器 } }
4)、运行效果:
2.2、以上效果是通过一个属性android:entries="@array/字符串名字",来实现的,下面通过代码来实现以上效果,去掉spinner_layout.xml中的此属性,
1)、去掉此属性<?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="vertical" > <!-- Spinner组件 --> <Spinner android:id="@+id/s_stu_name" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>
2)、 要想实现此效果,必须借助SpinnerAdapter才能实现。而通过观察SpinnerAdapter是一个接口,BaseAdapter类实现了此接口,所以只要重新定义一个类继承BaseAdapter类,就可以覆写相应的方法实现数据加载。public abstract class BaseAdapter extends Object implements ListAdapter SpinnerAdapter
3)、 新建一个类SpinnerDemoAdapter继承BaseAdapter,此时需要覆写一下方法:@Override public int getCount() {//表示获得总列表项数 return 0; } @Override public Object getItem(int arg0) {//获得列表项 return null; } @Override public long getItemId(int arg0) {//获得列表项id return 0; } @Override public View getView(int arg0, View arg1, ViewGroup arg2) {//获得view return null; }
覆写之后的方法,完整代码:4)、 Spinner子列表的内容为TextView,为此新建一个spinner_extra_layout.xml文件,在文件中只建立一个组件TextView。代码如下:package com.example.adapter; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; public class SpinnerDemoAdapter<T> extends BaseAdapter { //定义上下文参数,用于接受传过来的Activity类 private Context context; //定义资源文件id,用于接收传过来的布局文件 private int resource; //定义数组,用于接收传过来的数组数据 private String str[]; //重载构造方法 public SpinnerDemoAdapter(Context context,int resource,String str[]){ this.context = context; this.resource = resource; this.str = str; } @Override public int getCount() {//表示获得总列表项数 //如果传过来的数组不为空,则返回列表数(下拉列表显示条数)为数组长度,否则放回空 if(str!=null){ return str.length; } return 0; } @Override public Object getItem(int arg0) {//获得列表项 return null; } @Override public long getItemId(int arg0) {//获得列表项id return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) {//获得view //把传过来的Activity类,加载到TextView中 TextView tv_item = new TextView(context); //把数组中的的数据加载到TextView中 tv_item.setText(str[position]); return tv_item; } }
<?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="vertical" > <TextView android:id="@+id/tv_showspinneritem" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>
5)、 接下来在SpinnerDemoAdapter类中声明三个属性,用于接收构造函数传过来的参数。构造函数初始化这三个属性。//定义上下文参数,用于接受传过来的Activity类 private Context context; //定义资源文件id,用于接收传过来的布局文件 private int resource; //定义数组,用于接收传过来的数组数据 private String str[];
6)、 SpinnerDemoActivity类完整代码如下package com.example.basiccomponent2; import android.app.Activity; import android.os.Bundle; import android.widget.Spinner; import com.example.adapter.SpinnerDemoAdapter; public class SpinnerDemoActivity extends Activity { private Spinner s_stu_name = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.spinner_layout);// 设置布局管理器 // 获得组件id s_stu_name = (Spinner) super.findViewById(R.id.s_stu_name); // 获得资源文件中的数组 String str[] = this.getResources().getStringArray(R.array.s_stuname); /* * 通过SpinnerDemoAdapter类完成数据加载: * 1、Context context:表示Activity上下文 * 2、int textViewResourceId:表示布局文件中的组件id * 3、T[] objects:表示数组类型数据 */ SpinnerDemoAdapter<String> adapter = new SpinnerDemoAdapter<String>(SpinnerDemoActivity.this,R.id.tv_showspinneritem, str); //为组件加载ArrayAdapter s_stu_name.setAdapter(adapter); } }
7)、运行效果:
2.3、
1)、spinner_extra_layout.xml里面只有一个TextView组件,所以可以通过TextView tv_item = new TextView(context)实例化一个TextView,接下来换成convertView.findViewById完成,修改SpinnerDemoAdapter类。
package com.example.adapter; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.LinearLayout; import android.widget.TextView; import com.example.basiccomponent2.R; public class SpinnerDemoAdapter<T> extends BaseAdapter { //定义上下文参数 private Context context; //定义资源文件组件id private int resource; //定义数组 private String str[]; //定义 private LayoutInflater inflater; //重载构造方法 public SpinnerDemoAdapter(Context context,int resource,String str[]){ this.context = context; this.resource = resource; this.str = str; inflater = LayoutInflater.from(context);//初始化LayoutInflater } @Override public int getCount() {//表示获得总列表项数 //如果传过来的数组不为空,则返回列表数(下拉列表显示条数)为数组长度,否则放回空 if(str!=null){ return str.length; } return 0; } @Override public Object getItem(int arg0) {//获得列表项 return null; } @Override public long getItemId(int arg0) {//获得列表项id return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) {//获得view if(convertView==null){ convertView=inflater.inflate(resource, null); } //TextView tv_item = new TextView(context); TextView tv_item = (TextView) convertView.findViewById(R.id.tv_showspinneritem); int p = position%str.length; tv_item.setText(str[p]); return convertView; } }
2)、运行效果跟之前一样:2.4、接下来在Spinner的下拉列表中设置图片,即在下拉文本前面加入图片。
1)、package com.example.adapter; import android.content.Context; 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 com.example.basiccomponent2.R; public class SpinnerDemoAdapter<T> extends BaseAdapter { // 定义上下文参数 private Context context; // 定义资源文件组件id private int resource; // 定义数组 private String str[]; // 定义 private LayoutInflater inflater; // 定义图片id数组 int icon[] = { R.drawable.d1, R.drawable.d2, R.drawable.d3 }; // 重载构造方法 public SpinnerDemoAdapter(Context context, int resource, String str[]) { this.context = context; this.resource = resource; this.str = str; inflater = LayoutInflater.from(context);// 初始化LayoutInflater } @Override public int getCount() {// 表示获得总列表项数 // 如果传过来的数组不为空,则返回列表数(下拉列表显示条数)为数组长度,否则放回空 if (str != null) { return str.length; } return 0; } @Override public Object getItem(int arg0) {// 获得列表项 return null; } @Override public long getItemId(int arg0) {// 获得列表项id return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) {// 获得view if (convertView == null) { convertView = inflater.inflate(resource, null); } int i = position % icon.length;// 防止加入的图片越界 int t = position % str.length; // 获得spinner_extra_layout.xml中TextView的id TextView tv_item = (TextView) convertView.findViewById(R.id.tv_showspinneritem); // 获得spinner_extra_layout.xml中ImageView的id ImageView iv_item = (ImageView) convertView.findViewById(R.id.iv_showspinnerimage); iv_item.setImageResource(icon[i]);// 把每一个图片设置到Spinner下拉列表中 tv_item.setText(str[t]); // 把每一个文本设置到Spinner下拉列表中 return convertView; } }
2)、运行效果: