当前位置:   article > 正文

Android实现仿QQ登录可编辑下拉菜单_app登录页面带有下拉框选择功能

app登录页面带有下拉框选择功能

Android里,直接提供的Spinner控件虽然可以实现下拉菜单的效果,但其效果并不理想,很多时候我们需要类似手机QQ那样既可以在文本框中直接输入编辑文字,可以在下拉菜单中选中或者删除菜单选项,并且下拉菜单并不是以遮罩整个手机屏幕方式,而是以浮动在屏幕上的效果出现。下面呢,就来实现一下这些效果。

最后效果为:       

 

此次主要以EdiTextPopupWindowListViewAdapter来实现这种下拉效果。具体实现步骤就不一步步详细介绍了,直接贴完整代码吧,注释比较详细,相信都能看得懂。

 

 

//主界面Activity代码:

  1. public class SelectActivity extends Activity implements Callback {
  2. //PopupWindow对象
  3. private PopupWindow selectPopupWindow= null;
  4. //自定义Adapter
  5. private OptionsAdapter optionsAdapter = null;
  6. //下拉框选项数据源
  7. private ArrayList<String> datas = new ArrayList<String>();;
  8. //下拉框依附组件
  9. private LinearLayout parent;
  10. //下拉框依附组件宽度,也将作为下拉框的宽度
  11. private int pwidth;
  12. //文本框
  13. private EditText et;
  14. //下拉箭头图片组件
  15. private ImageView image;
  16. //恢复数据源按钮
  17. private Button button;
  18. //展示所有下拉选项的ListView
  19. private ListView listView = null;
  20. //用来处理选中或者删除下拉项消息
  21. private Handler handler;
  22. //是否初始化完成标志
  23. private boolean flag = false;
  24. @Override
  25. public void onCreate(Bundle savedInstanceState) {
  26. super.onCreate(savedInstanceState);
  27. setContentView(R.layout.select);
  28. }
  29. /**
  30. * 没有在onCreate方法中调用initWedget(),而是在onWindowFocusChanged方法中调用,
  31. * 是因为initWedget()中需要获取PopupWindow浮动下拉框依附的组件宽度,在onCreate方法中是无法获取到该宽度的
  32. */
  33. @Override
  34. public void onWindowFocusChanged(boolean hasFocus) {
  35. super.onWindowFocusChanged(hasFocus);
  36. while(!flag){
  37. initWedget();
  38. flag = true;
  39. }
  40. }
  41. /**
  42. * 初始化界面控件
  43. */
  44. private void initWedget(){
  45. //初始化Handler,用来处理消息
  46. handler = new Handler(SelectActivity.this);
  47. //初始化界面组件
  48. parent = (LinearLayout)findViewById(R.id.parent);
  49. et = (EditText)findViewById(R.id.edittext);
  50. image = (ImageView)findViewById(R.id.btn_select);
  51. //获取下拉框依附的组件宽度
  52. int width = parent.getWidth();
  53. pwidth = width;
  54. //设置点击下拉箭头图片事件,点击弹出PopupWindow浮动下拉框
  55. image.setOnClickListener(new View.OnClickListener() {
  56. @Override
  57. public void onClick(View v) {
  58. if(flag){
  59. //显示PopupWindow窗口
  60. popupWindwShowing();
  61. }
  62. }
  63. });
  64. //初始化PopupWindow
  65. initPopuWindow();
  66. button = (Button)findViewById(R.id.refresh);
  67. //设置点击事件,恢复下拉框列表数据,没有什么作用,纯粹是为了方便多看几次效果而设置
  68. button.setOnClickListener(new View.OnClickListener() {
  69. @Override
  70. public void onClick(View v) {
  71. initDatas();
  72. optionsAdapter.notifyDataSetChanged();
  73. }
  74. });
  75. }
  76. /**
  77. * 初始化填充Adapter所用List数据
  78. */
  79. private void initDatas(){
  80. datas.clear();
  81. datas.add("北京");
  82. datas.add("上海");
  83. datas.add("广州");
  84. datas.add("深圳");
  85. datas.add("重庆");
  86. datas.add("青岛");
  87. datas.add("石家庄");
  88. }
  89. /**
  90. * 初始化PopupWindow
  91. */
  92. private void initPopuWindow(){
  93. initDatas();
  94. //PopupWindow浮动下拉框布局
  95. View loginwindow = (View)this.getLayoutInflater().inflate(R.layout.options, null);
  96. listView = (ListView) loginwindow.findViewById(R.id.list);
  97. //设置自定义Adapter
  98. optionsAdapter = new OptionsAdapter(this, handler,datas);
  99. listView.setAdapter(optionsAdapter);
  100. selectPopupWindow = new PopupWindow(loginwindow, pwidth,LayoutParams.WRAP_CONTENT, true);
  101. selectPopupWindow.setOutsideTouchable(true);
  102. //这一句是为了实现弹出PopupWindow后,当点击屏幕其他部分及Back键时PopupWindow会消失,
  103. //没有这一句则效果不能出来,但并不会影响背景
  104. //本人能力极其有限,不明白其原因,还望高手、知情者指点一下
  105. selectPopupWindow.setBackgroundDrawable(new BitmapDrawable());
  106. }
  107. /**
  108. * 显示PopupWindow窗口
  109. *
  110. * @param popupwindow
  111. */
  112. public void popupWindwShowing() {
  113. //将selectPopupWindow作为parent的下拉框显示,并指定selectPopupWindow在Y方向上向上偏移3pix,
  114. //这是为了防止下拉框与文本框之间产生缝隙,影响界面美化
  115. //(是否会产生缝隙,及产生缝隙的大小,可能会根据机型、Android系统版本不同而异吧,不太清楚)
  116. selectPopupWindow.showAsDropDown(parent,0,-3);
  117. }
  118. /**
  119. * PopupWindow消失
  120. */
  121. public void dismiss(){
  122. selectPopupWindow.dismiss();
  123. }
  124. /**
  125. * 处理Hander消息
  126. */
  127. @Override
  128. public boolean handleMessage(Message message) {
  129. Bundle data = message.getData();
  130. switch(message.what){
  131. case 1:
  132. //选中下拉项,下拉框消失
  133. int selIndex = data.getInt("selIndex");
  134. et.setText(datas.get(selIndex));
  135. dismiss();
  136. break;
  137. case 2:
  138. //移除下拉项数据
  139. int delIndex = data.getInt("delIndex");
  140. datas.remove(delIndex);
  141. //刷新下拉列表
  142. optionsAdapter.notifyDataSetChanged();
  143. break;
  144. }
  145. return false;
  146. }
  147. }


自定义适配器Adapter代码:

  1. public class OptionsAdapter extends BaseAdapter {
  2. private ArrayList<String> list = new ArrayList<String>();
  3. private Activity activity = null;
  4. private Handler handler;
  5. /**
  6. * 自定义构造方法
  7. * @param activity
  8. * @param handler
  9. * @param list
  10. */
  11. public OptionsAdapter(Activity activity,Handler handler,ArrayList<String> list){
  12. this.activity = activity;
  13. this.handler = handler;
  14. this.list = list;
  15. }
  16. @Override
  17. public int getCount() {
  18. return list.size();
  19. }
  20. @Override
  21. public Object getItem(int position) {
  22. return list.get(position);
  23. }
  24. @Override
  25. public long getItemId(int position) {
  26. return position;
  27. }
  28. @Override
  29. public View getView(final int position, View convertView, ViewGroup parent) {
  30. ViewHolder holder = null;
  31. if (convertView == null) {
  32. holder = new ViewHolder();
  33. //下拉项布局
  34. convertView = LayoutInflater.from(activity).inflate(R.layout.option_item, null);
  35. holder.textView = (TextView) convertView.findViewById(R.id.item_text);
  36. holder.imageView = (ImageView) convertView.findViewById(R.id.delImage);
  37. convertView.setTag(holder);
  38. } else {
  39. holder = (ViewHolder) convertView.getTag();
  40. }
  41. holder.textView.setText(list.get(position));
  42. //为下拉框选项文字部分设置事件,最终效果是点击将其文字填充到文本框
  43. holder.textView.setOnClickListener(new View.OnClickListener() {
  44. @Override
  45. public void onClick(View v) {
  46. Message msg = new Message();
  47. Bundle data = new Bundle();
  48. //设置选中索引
  49. data.putInt("selIndex", position);
  50. msg.setData(data);
  51. msg.what = 1;
  52. //发出消息
  53. handler.sendMessage(msg);
  54. }
  55. });
  56. //为下拉框选项删除图标部分设置事件,最终效果是点击将该选项删除
  57. holder.imageView.setOnClickListener(new View.OnClickListener() {
  58. @Override
  59. public void onClick(View v) {
  60. Message msg = new Message();
  61. Bundle data = new Bundle();
  62. //设置删除索引
  63. data.putInt("delIndex", position);
  64. msg.setData(data);
  65. msg.what = 2;
  66. //发出消息
  67. handler.sendMessage(msg);
  68. }
  69. });
  70. return convertView;
  71. }
  72. }
  73. class ViewHolder {
  74. TextView textView;
  75. ImageView imageView;
  76. }


 


 

主界面布局select.xml文件:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. android:background="#EEEED1"
  7. >
  8. <LinearLayout android:id="@+id/parent" android:layout_width="wrap_content"
	android:layout_height="wrap_content" android:orientation="horizontal" 
  1. android:layout_marginTop="50dp" android:layout_marginLeft="30dp">
  2. <EditText android:id="@+id/edittext" android:layout_width="200dp" android:singleLine="true"
  3. android:layout_height="40dp" android:background="@drawable/bg1" android:paddingLeft="3dp"/>
  4. <ImageView android:id="@+id/btn_select" android:layout_width="30dp" android:layout_height="40dp"
  5. android:src="@drawable/img1" android:scaleType="fitXY"/>
  6. </LinearLayout>
  7. <Button android:id="@+id/refresh" android:layout_width="wrap_content" android:layout_height="45dp"
  8. android:text="恢复" android:textColor="#000000" android:textSize="20sp"
  1. android:layout_marginTop="30dp" android:layout_marginLeft="30dp"/>
  2. </LinearLayout>

 

 

PopupWindow浮动下拉框布局options.xml文件:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="wrap_content"
  6. android:gravity="center_horizontal"
  7. >
  8. <ListView android:id="@+id/list" android:layout_width="fill_parent"
  9. android:layout_height="wrap_content" android:cacheColorHint="#00000000">
  10. </ListView>
  11. </LinearLayout>


 

下拉选项布局option_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="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:background="#235654"
  6. >
  7. <RelativeLayout
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:gravity="center_vertical"
  11. android:minHeight="40dp"
  12. >
  13. <ImageView android:id="@+id/delImage" android:layout_width="20dp"
  1. android:layout_height="wrap_content" android:src="@drawable/del" android:textSize="18sp"
  2. android:layout_alignParentRight="true" android:layout_marginRight="10dp"/>
  3. <TextView android:id="@+id/item_text" android:layout_height="wrap_content"
  4. android:layout_width="fill_parent" android:layout_toLeftOf="@id/delImage"
  5. android:paddingLeft="5dp" android:layout_alignParentLeft="true"></TextView>
  6. </RelativeLayout>
  7. </LinearLayout>


 

到此代码及布局文件基本都贴完了。哦,对了,我是在Android 2.2 测试运行的。

本人对Android学习、了解十分有限,而且各种文件、变量、方法等等命名也很不规范,所以代码肯定有很多不足之处,还请各位海涵!当然,更希望各位能不吝赐教,本人将满怀荣幸与感激!


 原帖地址:http://blog.csdn.net/zw_yuyan/article/details/7734736

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/111503
推荐阅读
相关标签
  

闽ICP备14008679号