1. 下拉菜单效果图如下:

在EditText的右边放置一个小箭头的图片,点击图片,在EditText的下方弹出一个popupWindow,并对popupWindow进行一些设置即得到想要的效果。

自定义控件(视图)2期笔记04:自定义控件之使用系统控件(下拉菜单框)_ide



2. 下面通过一个案例演示上面的效果:

(1)新建一个Android工程,命名为" 下拉菜单 ",同时也有美工提供的图片,如下:

自定义控件(视图)2期笔记04:自定义控件之使用系统控件(下拉菜单框)_java_02


(2)首先我们设置一下布局文件activity_main.xml,如下:


1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  2     xmlns:tools="http://schemas.android.com/tools"  3     android:layout_width="match_parent"  4     android:layout_height="match_parent"  5     tools:context="com.himi.spinnerdemo.MainActivity" >  6   7     <EditText  8         android:layout_width="200dp"  9         android:layout_height="wrap_content" 10         android:layout_centerHorizontal="true" 11         android:layout_marginTop="10dp" 12         android:text="@string/hello_world" 13         android:id="@+id/input" /> 14     <ImageView  15         android:layout_width="wrap_content" 16         android:layout_height="wrap_content" 17         android:id="@+id/down_arrow" 18         android:background="@drawable/down_arrow" 19         android:layout_alignRight="@id/input" 20         android:layout_marginTop="10dp"/> 21  22 </RelativeLayout>


布局效果如下:

自定义控件(视图)2期笔记04:自定义控件之使用系统控件(下拉菜单框)_android_03


(3)MainActivity.java,如下:


1 package com.himi.spinnerdemo;   2    3 import java.util.ArrayList;   4 import java.util.List;   5    6 import android.app.Activity;   7 import android.os.Bundle;   8 import android.view.View;   9 import android.view.View.OnClickListener;  10 import android.view.ViewGroup;  11 import android.widget.BaseAdapter;  12 import android.widget.EditText;  13 import android.widget.ImageView;  14 import android.widget.ListView;  15 import android.widget.PopupWindow;  16 import android.widget.TextView;  17   18 public class MainActivity extends Activity {  19     private EditText input;  20     private ImageView downArrow;  21   22     private List<String> msgList;  23     private PopupWindow  popWin;  24     private ListView listView;  25     @Override  26     protected void onCreate(Bundle savedInstanceState) {  27         super.onCreate(savedInstanceState);  28         setContentView(R.layout.activity_main);  29           30         input = (EditText) findViewById(R.id.input);  31         downArrow = (ImageView) findViewById(R.id.down_arrow);  32         msgList = new ArrayList<String>();  33         //初始化msgList  34         for(int i =0; i<20; i++) {  35             msgList.add("1000000000"+i);  36         }  37           38         initListView();  39           40         downArrow.setOnClickListener(new OnClickListener() {  41               42             public void onClick(View v) {  43                 //定义popupWindow  44                 popWin = new PopupWindow(MainActivity.this);  45                 popWin.setWidth(input.getWidth());  46                 popWin.setHeight(200);  47                 popWin.setContentView(listView);//为popWindow填充内容  48                 popWin.setOutsideTouchable(true);//点击popWin以外的区域,自动关闭popWin  49                 popWin.showAsDropDown(input, 0, 0);//设置弹出窗口,显式的位置  50                   51             }  52         });  53           54       55     }  56     private void initListView() {  57         listView = new ListView(this);  58         listView.setBackgroundResource(R.drawable.listview_background);  59         listView.setDivider(null);//设置条目之间的分隔线为null  60         listView.setVerticalScrollBarEnabled(false);//关闭竖直方向的滑动条  61         listView.setAdapter(new MyListAdapter());  62           63     }  64       65     private class ViewHolder{  66         TextView tv_msg;  67         ImageView delete;  68     }  69       70     private class MyListAdapter extends BaseAdapter {  71   72         public int getCount() {  73             // TODO 自动生成的方法存根  74             return msgList.size();//不能是设置为20  75         }  76   77         public View getView(final int position, View convertView, ViewGroup parent) {  78             ViewHolder holder;  79             if (convertView == null) {  80                 convertView = View.inflate(getApplicationContext(),  81                         R.layout.list_item, null);  82                 holder = new ViewHolder();  83                 holder.delete = (ImageView) convertView.findViewById(R.id.delete);  84                 holder.tv_msg = (TextView) convertView.findViewById(R.id.tv_list_item);  85                 convertView.setTag(holder);          86             } else {  87                 holder = (ViewHolder)convertView.getTag();  88                 holder.tv_msg.setText(msgList.get(position));  89                 holder.delete.setOnClickListener(new OnClickListener() {  90                       91                     public void onClick(View v) {  92                         // 删除对应的条目,实际是就是删除数据源的数据,然后让Adapter刷新一下  93                         msgList.remove(position);  94                         //刷新ListView  95                         MyListAdapter.this.notifyDataSetChanged();  96                           97                     }  98                 });  99                 convertView.setOnClickListener(new OnClickListener() { 100  101                     public void onClick(View v) { 102                         // 设置输入框 103                         input.setText(msgList.get(position)); 104                         if (popWin != null && popWin.isShowing()) { 105                             popWin.dismiss(); 106                         } 107                     } 108                 }); 109             } 110             return convertView; 111         } 112  113         public Object getItem(int position) { 114             // TODO 自动生成的方法存根 115             return position; 116         } 117  118         public long getItemId(int position) { 119             // TODO 自动生成的方法存根 120             return position; 121         } 122  123     } 124      125      126      127 }


其中ListView的item样式布局是list_item.xml,如下:


1 <?xml version="1.0" encoding="utf-8"?>  2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  3     android:layout_width="match_parent"  4     android:layout_height="wrap_content"  5     android:gravity="center_vertical"  6     android:orientation="horizontal" >  7   8     <ImageView  9         android:layout_width="wrap_content" 10         android:layout_height="wrap_content" 11         android:background="@drawable/user" /> 12     <!-- layout_weight默认是0,这里显式设置TextView权重为1.其他两个ImageView为默认权重为0 --> 13  14     <TextView 15         android:id="@+id/tv_list_item" 16         android:layout_width="match_parent" 17         android:layout_height="wrap_content" 18         android:layout_weight="1" 19         android:gravity="center_horizontal" 20         android:text="@string/hello_world" /> 21  22     <ImageView 23         android:id="@+id/delete" 24         android:layout_width="wrap_content" 25         android:layout_height="wrap_content" 26         android:background="@drawable/delete" /> 27  28 </LinearLayout>


list_item.xml的布局效果如下:

自定义控件(视图)2期笔记04:自定义控件之使用系统控件(下拉菜单框)_ide_04


(4)这里不需要权限设置(不用担心AndroidMainfest.xml),布署程序到模拟器上,如下:

自定义控件(视图)2期笔记04:自定义控件之使用系统控件(下拉菜单框)_xml_05