Android进阶之绘制-自定义View完全掌握(三)
程序员文章站
2022-06-30 08:37:53
自定义View系列的第三篇博客,我们来学习如何实现自定义下拉框。 今天的程序,我们来实现这样的一个效果。 布局非常简单,我们直接开始编码。 修改activity_main.xml文件的代码。 布局代码非常简单,就是两个控件。 接下来修改MainActivity的代码。 item_main.xml文件 ......
自定义view系列的第三篇博客,我们来学习如何实现自定义下拉框。
今天的程序,我们来实现这样的一个效果。
布局非常简单,我们直接开始编码。
修改activity_main.xml文件的代码。
<?xml version="1.0" encoding="utf-8"?> <relativelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.itcast.test0430.mainactivity"> <edittext android:id="@+id/et_input" android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="middle" android:hint="请输入内容..." android:paddingright="40dp" android:singleline="true" /> <imageview android:id="@+id/iv_down_arrow" android:layout_width="30dp" android:layout_height="30dp" android:layout_alignright="@id/et_input" android:layout_aligntop="@id/et_input" android:padding="5dp" android:src="@drawable/down_arrow" /> </relativelayout>
布局代码非常简单,就是两个控件。
接下来修改mainactivity的代码。
package com.itcast.test0430; import android.graphics.color; import android.os.bundle; import android.support.v7.app.appcompatactivity; import android.view.view; import android.view.viewgroup; import android.widget.adapterview; import android.widget.baseadapter; import android.widget.edittext; import android.widget.imageview; import android.widget.listview; import android.widget.popupwindow; import android.widget.textview; import java.util.arraylist; import butterknife.bindview; import butterknife.butterknife; import butterknife.onclick; public class mainactivity extends appcompatactivity { @bindview(r.id.et_input) edittext etinput; @bindview(r.id.iv_down_arrow) imageview ivdownarrow; /** * */ private popupwindow popupwindow; private listview listview; private arraylist<string> msgs; private myadapter adapter; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); butterknife.bind(this); listview = new listview(this); listview.setbackgroundcolor(color.white); //准备数据 msgs = new arraylist<>(); for(int i = 0;i < 500;i++) { msgs.add(i + "--aaaaaa---" + i); } adapter = new myadapter(); listview.setadapter(adapter); listview.setonitemclicklistener(new adapterview.onitemclicklistener() { @override public void onitemclick(adapterview<?> parent, view view, int position, long id) { //1、得到数据 string msg = msgs.get(position); //2、设置到输入框 etinput.settext(msg); if(popupwindow != null && popupwindow.isshowing()){ popupwindow.dismiss(); popupwindow = null; } } }); } @onclick(r.id.et_input) public void onviewclick(view view){ if(popupwindow == null){ popupwindow = new popupwindow(this); popupwindow.setwidth(etinput.getwidth()); popupwindow.setheight(400); popupwindow.setcontentview(listview); popupwindow.setfocusable(true);//设置焦点 } popupwindow.showasdropdown(etinput,0,0); } class myadapter extends baseadapter{ @override public int getcount() { return msgs.size(); } @override public object getitem(int position) { return null; } @override public long getitemid(int position) { return 0; } @override public view getview(int position, view convertview, viewgroup parent) { viewholder viewholder; if(convertview == null){ convertview = view.inflate(mainactivity.this,r.layout.item_main,null); viewholder = new viewholder(); viewholder.tv_msg = convertview.findviewbyid(r.id.tv_msg); viewholder.iv_delete = convertview.findviewbyid(r.id.iv_delete); convertview.settag(viewholder); }else{ viewholder = (viewholder) convertview.gettag(); } //根据位置得到数据 final string msg = msgs.get(position); viewholder.tv_msg.settext(msg); //设置删除 viewholder.iv_delete.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { //1、从集合删除 msgs.remove(msg); //2、刷新ui---也就是 刷新适配器 adapter.notifydatasetchanged(); } }); return convertview; } } static class viewholder{ textview tv_msg; imageview iv_delete; } }
item_main.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="50dp" android:gravity="center_vertical" android:orientation="horizontal" android:padding="5dp"> <imageview android:layout_width="50dp" android:layout_height="50dp" android:layout_gravity="center_vertical" android:layout_margin="5dp" android:padding="3dp" android:src="@drawable/user" /> <textview android:id="@+id/tv_msg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_margin="5dp" android:layout_weight="1" android:gravity="center" android:padding="3dp" android:text="三个火枪手" android:textcolor="#000" /> <imageview android:id="@+id/iv_delete" android:layout_width="30dp" android:layout_height="30dp" android:layout_gravity="center_vertical" android:layout_margin="5dp" android:padding="3dp" android:src="@drawable/delete" /> </linearlayout>
这里的代码也很简单,所以不作过多解释,代码的每个地方都有注释。唯一需要注意的地方就是,因为我们的popupwindow类是设置了宽为200,而只要是在代码中设置的控件属性,它的单位均为px(像素),而像素是没有适配功能的,所以为了使我们的程序能够在任意分辨率的手机上正确运行,我们应该把像素转换为dp。
提供给大家一个工具类,用于dp与px之间的转换。
package com.itcast.test0430; import android.content.context; public class densityutil { /** * 根据手机的分辨率从dip的单位转换为px(像素) */ public static int diptopx(context context,float dpvalue){ final float scale = context.getresources().getdisplaymetrics().density; return (int) (dpvalue * scale + 0.5f); } /** * 根据手机的分辨率从px(像素)的单位转换为dip */ public static int pxtodip(context context,float pxvalue){ final float scale = context.getresources().getdisplaymetrics().density; return (int) (pxvalue * scale + 0.5f); } }
所以,我们把popupwindow.setheight(400);
改为
int height = densityutil.diptopx(this,400); popupwindow.setheight(height);
即可。
现在运行项目,预览一下效果。
这样,我们的下拉框也就实现了。现在有了dp和px之间转换的工具类,我们就可以在需要屏幕适配的地方使用它了,包括我们之前练习的一些项目。
上一篇: php数据提交POSt
推荐阅读
-
Android进阶之绘制-自定义View完全掌握(一)
-
Android进阶之绘制-自定义View完全掌握(二)
-
Android进阶之绘制-自定义View完全掌握(三)
-
Android 自定义View 之 Path PathMeasure (三)之渐变色进度条Progress
-
Android高级进阶之自定义View
-
【Android进阶】RecyclerView之绘制流程(三)
-
Android自定义View之popupwindow进阶封装:高仿ios “item动画弹出”效果的popupwindow。
-
Android 自定义View 之 Path PathMeasure (三)之渐变色进度条Progress