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中通过回调来实现点击事件。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Android
# 自定义view模板并实现点击事件的回调
# view模板回调
# Android中父View和子view的点击事件处理问题探讨
# 实例详解Android解决按钮重复点击问题
# Android之有效防止按钮多次重复点击的方法(必看篇)
# Android 快速实现防止网络重复请求&按钮重复点击的方法
# Android 防止多次重复点击的三种方法的示例
# Android防止按钮重复点击示例代码
# Android优雅地处理按钮重复点击的几种方法
# Android中如何优雅的处理重复点击实例代码
# Android中AOP的应用实践之过滤重复点击
# Android开发教程之如何屏蔽View的重复点击
# 回调
# 来实现
# 自定义
# 不需要
# 只需
# 希望能
# 这样做
# 做一个
# 每次都
# 谢谢大家
# 先看
# 新建一个
# 网易新闻
# 背景色
# 中做
# 失去了
# 完成后
# 目录下
# 必须要
# 目的是
相关文章:
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
北京的网站制作公司有哪些,哪个视频网站最好?
青浦网站制作公司有哪些,苹果官网发货地是哪里?
如何安全更换建站之星模板并保留数据?
linux top下的 minerd 木马清除方法
制作销售网站教学视频,销售网站有哪些?
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
在线制作视频的网站有哪些,电脑如何制作视频短片?
香港服务器租用每月最低只需15元?
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
如何选择美橙互联多站合一建站方案?
网站制作费用多少钱,一个网站的运营,需要哪些费用?
如何快速搭建FTP站点实现文件共享?
巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成
行程制作网站有哪些,第三方机票电子行程单怎么开?
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
大连网站设计制作招聘信息,大连投诉网站有哪些?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?
香港服务器网站推广:SEO优化与外贸独立站搭建策略
如何撰写建站申请书?关键要点有哪些?
为什么Go需要go mod文件_Go go mod文件作用说明
如何获取上海专业网站定制建站电话?
b2c电商网站制作流程,b2c水平综合的电商平台?
文字头像制作网站推荐软件,醒图能自动配文字吗?
如何选择CMS系统实现快速建站与SEO优化?
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?
小建面朝正北,A点实际方位是否存在偏差?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
MySQL查询结果复制到新表的方法(更新、插入)
教程网站设计制作软件,怎么创建自己的一个网站?
如何选择建站程序?包含哪些必备功能与类型?
小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?
如何在万网开始建站?分步指南解析
香港服务器WordPress建站指南:SEO优化与高效部署策略
湖北网站制作公司有哪些,湖北清能集团官网?
建站VPS配置与SEO优化指南:关键词排名提升策略
如何在阿里云服务器自主搭建网站?
如何构建满足综合性能需求的优质建站方案?
北京专业网站制作设计师招聘,北京白云观官方网站?
如何在自有机房高效搭建专业网站?
如何高效配置香港服务器实现快速建站?
利用JavaScript实现拖拽改变元素大小
制作电商网页,电商供应链怎么做?
如何通过虚拟主机快速完成网站搭建?
如何访问已购建站主机并解决登录问题?
做企业网站制作流程,企业网站制作基本流程有哪些?
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
如何用花生壳三步快速搭建专属网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。