Android 自定义view模板并实现点击事件的回调
程序员文章站
2023-12-20 19:12:10
android 自定义view模板并实现点击事件的回调
主要的目的就是仿老版qq的一个界面做一个模板。然后实现点击事件的回调。先看效果图:
步骤如下:
1....
android 自定义view模板并实现点击事件的回调
主要的目的就是仿老版qq的一个界面做一个模板。然后实现点击事件的回调。先看效果图:
步骤如下:
1.在res/values/目录下新建一个atts.xml文件
内容如下:
<resources> <declare-styleable name="topbar"> <attr name="title" format="string"/> <attr name="titlebacgroud" format="reference|color"/> <attr name="titlesize" format="dimension"></attr> <attr name="leftbtntitle" format="string"></attr> <attr name="leftbtncolor" format="color"></attr> <attr name="leftbtnsize" format="dimension"></attr> <attr name="rightbtntitle" format="string"></attr> <attr name="rightbtncolor" format="color"></attr> <attr name="rightbtnsize" format="dimension"></attr> </declare-styleable>
attr.xml文件完成后,就是写一个topbar.java文件来进行布局:
public class topbar extends relativelayout{ private button leftbtn, rightbtn; private textview tvtitle; private string title; private float titlesize ; private drawable titlebackground; private string leftbtntitle; private int leftbtncolor; private float leftbtnsize; private string rightbtntitle; private int rightbtncolor; private float rightbtnsize; private layoutparams leftbtnparams ,righbtnparams,titleparams; /** * 为topbar添加回调点击事件,好处是不需要每次都修改topbar中的点击事件,只需修改从外面传进来的listener的点击事件 * @param context * @param attrs */ public interface topbarclicklistener{ void leftbtnclick(); void rightbtnclick(); } private topbarclicklistener listener; public void settopbarclicklistener(topbarclicklistener ls){ this.listener = ls; } public topbar(context context, attributeset attrs) { super(context, attrs); // todo auto-generated constructor stub typedarray ta = context.obtainstyledattributes(attrs, r.styleable.topbar); title = ta.getstring(r.styleable.topbar_title); titlesize = ta.getdimension(r.styleable.topbar_titlesize, 0); titlebackground = ta.getdrawable(r.styleable.topbar_titlebacgroud); leftbtntitle = ta.getstring(r.styleable.topbar_leftbtntitle); leftbtncolor = ta.getcolor(r.styleable.topbar_leftbtncolor, 0); leftbtnsize = ta.getdimension(r.styleable.topbar_leftbtnsize, 0); rightbtntitle = ta.getstring(r.styleable.topbar_rightbtntitle); rightbtncolor = ta.getcolor(r.styleable.topbar_rightbtncolor, 0); rightbtnsize = ta.getdimension(r.styleable.topbar_rightbtnsize, 0); ta.recycle();//资源回收 tvtitle = new textview(context); leftbtn = new button(context); rightbtn = new button(context); tvtitle.settext(title); tvtitle.settextsize(titlesize); tvtitle.setbackground(titlebackground); leftbtn.settext(leftbtntitle); leftbtn.settextcolor(leftbtncolor); leftbtn.settextsize(leftbtnsize); rightbtn.settext(rightbtntitle); rightbtn.settextcolor(rightbtncolor); rightbtn.settextsize(rightbtnsize); setbackgroundcolor(color.dkgray);//设置整个背景色 /** * 将3个控件进行布局 */ //左边的按钮位于父布局的左边,通过addrule(relativelayout.align_parent_left);来实现 leftbtnparams = new layoutparams(relativelayout.layoutparams.wrap_content, relativelayout.layoutparams.wrap_content); leftbtnparams.addrule(relativelayout.align_parent_left); leftbtnparams.setmargins(0, 18, 0, 0); addview(leftbtn, leftbtnparams); righbtnparams = new layoutparams(relativelayout.layoutparams.wrap_content, relativelayout.layoutparams.wrap_content); righbtnparams.addrule(relativelayout.align_parent_right); righbtnparams.setmargins(0, 18, 0, 0); addview(rightbtn, righbtnparams); //中间的textview位于父布局的中间,addrule(relativelayout.center_in_parent); titleparams = new layoutparams(relativelayout.layoutparams.wrap_content, relativelayout.layoutparams.match_parent); titleparams.addrule(relativelayout.center_in_parent); tvtitle.setgravity(gravity.center); addview(tvtitle, titleparams); leftbtn.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { // todo auto-generated method stub listener.leftbtnclick(); } }); rightbtn.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { // todo auto-generated method stub listener.rightbtnclick(); } }); } public void settvtitle(string value){ tvtitle.settext(value); } }
topbar是通过继承自relativelayout来实现的。
注意:由于我们的目的是自定义模板view,所以我们最好不要在topbar.java中做如下操作:
leftbtn.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { // todo auto-generated method stub //listener.leftbtnclick();//回调实现 toast.maketext(context, "left buttom click", toast.length_short).show(); } }); rightbtn.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { // todo auto-generated method stub //listener.rightbtnclick();//回调实现 toast.maketext(context, "right buttom click", toast.length_short).show(); } });
如果这样做对于不同的点击事件都需要修改topbar.java文件中的点击事件,失去了模板的意义。
主布局文件代码如下:
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res/com.example.viewpagerdemo" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <com.example.viewpagerdemo.view.topbar android:id="@+id/topbar" android:layout_width="match_parent" android:layout_height="100dp" custom:title="网易新闻" custom:titlebacgroud="#ff2255" custom:titlesize="30sp" custom:leftbtntitle="back" custom:leftbtncolor="#ff4400" custom:leftbtnsize="24sp" custom:rightbtntitle="more" custom:rightbtncolor="#ff4400" custom:rightbtnsize="24sp" ></com.example.viewpagerdemo.view.topbar> </linearlayout>
上面的xmlns:custom=”http://schemas.android.com/apk/res/com.example.viewpagerdemo”是必须要添加的,res/ 后面是包名。作用相当于导入包名
mainactivity.java 文件如下:
public class topbaractivity extends activity{ private topbar mtopbar; @override protected void oncreate(bundle savedinstancestate) { // todo auto-generated method stub super.oncreate(savedinstancestate); requestwindowfeature(window.feature_no_title); setcontentview(r.layout.topbar_layout); mtopbar = (topbar) findviewbyid(r.id.topbar); /** * 利用回调实现topbar的点击事件 */ mtopbar.settopbarclicklistener(new topbarclicklistener() { @override public void rightbtnclick() { // todo auto-generated method stub toast.maketext(topbaractivity.this, "right buttom click", toast.length_short).show(); } @override public void leftbtnclick() { // todo auto-generated method stub toast.maketext(topbaractivity.this, "left buttom click", toast.length_short).show(); } }); //更改topbar中显示的标题 mtopbar.settvtitle("凤凰网"); } }
这样可以在mainactivity中通过回调来实现点击事件。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!