热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android自定义view事件吗,Android自定义view模板并实现点击事件的回调

Android自定义view模板并实现点击事件的回调主要的目的就是仿老版QQ的一个界面做一个模板。然后实现点击事件的回调。先看效果图:步骤如下:1.在r

Android 自定义view模板并实现点击事件的回调

主要的目的就是仿老版QQ的一个界面做一个模板。然后实现点击事件的回调。先看效果图:

ae066f71217c60994cb183fce9d62b79.png

步骤如下:

1.在res/values/目录下新建一个atts.xml文件

内容如下:

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文件中的点击事件,失去了模板的意义。

主布局文件代码如下:

xmlns:custom="http://schemas.android.com/apk/res/com.example.viewpagerdemo"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

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"

>

上面的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中通过回调来实现点击事件。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!



推荐阅读
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • Spring Data JdbcTemplate 入门指南
    本文将介绍如何使用 Spring JdbcTemplate 进行数据库操作,包括查询和插入数据。我们将通过一个学生表的示例来演示具体步骤。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 本文探讨了使用JavaScript在不同页面间传递参数的技术方法。具体而言,从a.html页面跳转至b.html时,如何携带参数并使b.html替代当前页面显示,而非新开窗口。文中详细介绍了实现这一功能的代码及注释,帮助开发者更好地理解和应用该技术。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • 本文探讨了利用Java实现WebSocket实时消息推送技术的方法。与传统的轮询、长连接或短连接等方案相比,WebSocket提供了一种更为高效和低延迟的双向通信机制。通过建立持久连接,服务器能够主动向客户端推送数据,从而实现真正的实时消息传递。此外,本文还介绍了WebSocket在实际应用中的优势和应用场景,并提供了详细的实现步骤和技术细节。 ... [详细]
  • 本文作为“实现简易版Spring系列”的第五篇,继前文深入探讨了Spring框架的核心技术之一——控制反转(IoC)之后,将重点转向另一个关键技术——面向切面编程(AOP)。对于使用Spring框架进行开发的开发者来说,AOP是一个不可或缺的概念。了解AOP的背景及其基本原理,对于掌握这一技术至关重要。本文将通过具体示例,详细解析AOP的实现机制,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 本文详细探讨了 jQuery 中 `ajaxSubmit` 方法的使用技巧及其应用场景。首先,介绍了如何正确引入必要的脚本文件,如 `jquery.form.js` 和 `jquery-1.8.0.min.js`。接着,通过具体示例展示了如何利用 `ajaxSubmit` 方法实现表单的异步提交,包括数据的发送、接收和处理。此外,还讨论了该方法在不同场景下的应用,如文件上传、表单验证和动态更新页面内容等,提供了丰富的代码示例和最佳实践建议。 ... [详细]
  • 如何在页面底部添加倾斜样式效果? ... [详细]
author-avatar
suzhaolie
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有