android 原理 组合控件_Android_组合方式自定义控件
用组合的方式自定义一个导航栏,功能:
左边个back被点击时,用监听的方式告诉系统自己被点击了了;右边个back被点击时,进入下一个界面。
a.png
在MainActivity中用代码实现:
定义一个xml资源文件,定义button控件的背景颜色和形状
android:shape="rectangle">
定义一个wll类,继承于RelativeLayout ,用于定义俩个button的属性
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RelativeLayout;
import androidx.core.content.res.ResourcesCompat;
public class wll extends RelativeLayout {
// 将两个控件全局化、私有化
private Button back_button;
private Button back_button1;
// 定义控件监听者
private backButtonDidClickedListener listener;
// 实现RelativeLayout 的两个必须实现的方法
public wll(Context context) {
this(context,null);
}
public wll(Context context, AttributeSet attrs) {
super(context, attrs);
init(context,attrs);
}
public void init(Context context, AttributeSet attrs){
setBackgroundColor(Color.MAGENTA);
setBack_button(back_button);
setBack_button1(back_button1);
}
// 实现button的set、get方法
public void setBack_button(Button back_button) {
this.back_button = back_button;
// 创建控件
back_button = new Button(getContext());
// 创建button的布局
LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.leftMargin = (int)(10 * getResources().getDisplayMetrics().density);
params.topMargin = (int)(10 * getResources().getDisplayMetrics().density);
// 取出之前定义的xml资源文件,用于设置button的背景
Drawable drawable1 = ResourcesCompat.getDrawable(getResources(), R.drawable.back_shape, null);
back_button.setBackground(drawable1);
back_button.setText("Back");
// 给button添加监听事件
back_button.setOnClickListener(new OnClickListener() {
// 给button添加点击事件
@Override
public void onClick(View view) {
if (listener != null) {
listener.ButtonDidClicked();
}
}
});
// 添加控件
addView(back_button,params);
}
public void setBack_button1(Button back_button1) {
this.back_button1 = back_button1;
back_button1 = new Button(getContext());
LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.leftMargin = (int)(300 * getResources().getDisplayMetrics().density);
params.topMargin = (int)(10 * getResources().getDisplayMetrics().density);
Drawable drawable1 = ResourcesCompat.getDrawable(getResources(), R.drawable.back_shape, null);
back_button1.setBackground(drawable1);
back_button1.setText("Back");
back_button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (listener != null) {
listener.changeMainActivity();
}
}
});
addView(back_button1,params);
}
public Button getBack_button() {
return back_button;
}
public Button getBack_button1() {
return back_button;
}
// 定义接口
public interface backButtonDidClickedListener{
void ButtonDidClicked();
void changeMainActivity();
}
// 添加监听者
public void addbackButtonDidClickedListener(backButtonDidClickedListener listener){
this.listener = listener;
}
}
在MainActivity中调用wll类实现具体的功能
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 定义一个wll类的对象
wll yk = new wll(this);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,200);
// 实现接口定义的两个方法
yk.addbackButtonDidClickedListener(new wll.backButtonDidClickedListener() {
@Override
public void ButtonDidClicked() {
System.out.println("被点击了");
}
@Override
public void changeMainActivity() {
goToNext();
}
});
setContentView(yk,params);
}
// 跳转界面
public void goToNext(){
// 创建一个intent,确定跳转的界面
// intent:意图
// 显式意图(调到自己的界面)、隐式意图(调到别人的界面中)我定义的第二个界面命名为:Main2Activity
Intent intent = new Intent(this, Main2Activity.class);
// 跳转
startActivity(intent);
}
}
使用xml的方式实现:
首先展示效果图:
展示Back
不展示Back
创建一个wll类,继承于LinearLayout
public class wll extends LinearLayout {
// 全局化三个button
private Button back1;
private Button back2;
private Button back3;
private boolean isShowBack = false;
int state = 0;
// 继承LinearLayout 中的方法
public wll(Context context) {
this(context,null);
}
public wll(Context context, AttributeSet attrs) {
super(context, attrs);
init(context,attrs);
}
private void init(Context context, AttributeSet attrs) {
setOrientation(LinearLayout.HORIZONTAL);
setBackgroundColor(Color.GRAY);
boolean isShow1 = false;
// 获取自定义的属性
if (attrs != null) {
TypedArray array =context.obtainStyledAttributes(attrs,R.styleable.wll1);
isShow1 = array.getBoolean(R.styleable.wll1_isShow_back,true);
}
// 调用button控件的set方法,并将自定义的属性传递给控件(只有back1使用了自定义的属性)
setBack1(back1,isShow1);
setBack2(back2);
setBack3(back3);
}
// 实现控件的set、get方法
public void setBack1(Button back1,boolean isShow) {
this.back1 = back1;
// 自定义的属性如果为true,显示控件back1,否则不显示
if (isShow == true) {
// 调用自定义的创建控件的方法
initButton(back1,"Back",5);
}
}
public void setBack2(Button back2) {
this.back2 = back2;
// 调用自定义的创建控件的方法
initButton(back2,"主页",65);
}
public void setBack3(Button back3) {
this.back3 = back3;
// 调用自定义的创建控件的方法
initButton(back3,"跳转",65);
}
public Button getBack1() {
return back1;
}
public Button getBack2() {
return back2;
}
public Button getBack3() {
return back3;
}
// 封装创建控件的方法,需要参数:button、button的标题、button之间的间距
public void initButton(Button button,String text,int margin){
button = new Button(getContext());
button.setText(text);
LinearLayout.LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.leftMargin = (int)(margin * getResources().getDisplayMetrics().density);
addView(button,params);
}
创建自定义属性的xml文件:
在MainActivity_xml中调用wll类:
android:layout_width="match_parent"
android:layout_height="100dp"
app:isShow_back = "false"
/>
android 原理 组合控件_Android_组合方式自定义控件相关推荐
- Android 自定义组合控件小结
Android 自定义组合控件小结 引言 接触Android UI开发的这段时间以来,对自定义组合控件有了一定的了解,为此小结一下,本文小结内容主要讨论的是如何使用Android SDK提供的布局和控 ...
- android自定义控件中文乱码,Android笔记--自定义View之组合控件
Android-自定义View 分享是最好的记忆-- 如需转发请注明出处 [强调]:共同学习 共同进步 不喜勿喷 内容简介 前言 实现 总结 1. 前言 这次更新有2个目的 1. 复用控件,而不是每次 ...
- android中的标题栏是什么意思,Android通用标题栏组合控件
原标题:Android通用标题栏组合控件 快,点击蓝色"字体"关注这个公众号,一起涨姿势 由于项目中经常用到此种组合控件,就封装了下,具体效果看下图,老司机可以绕道哈! 一.主要功 ...
- Android 手机卫士--自定义组合控件构件布局结构
由于设置中心条目中的布局都很类似,所以可以考虑使用自定义组合控件来简化实现 本文地址:http://www.cnblogs.com/wuyudong/p/5909043.html,转载请注明源地址. ...
- Android View体系(十)自定义组合控件
相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源 ...
- android 中的组合控件的设计
在开发应用程序的时候,很多时候会使用到几个重复的控件,例如Android手机的设置界面里面的位置服务里面的每一栏都是组合控件,也就是说多个控件组成一个整体,如下图所示: 红色方框里面的是由两个Text ...
- 《移动项目实践》实验报告——Android组合控件
实验目的 1.熟悉App开发常用的一些组合控件,主要包括底部标签栏的实现和用法.顶部导航栏的用法.横幅轮播条的实现和用法.循环视图3种布局的用法.材质设计库3种布局的用法等: 实验内容 仿淘宝主页 上 ...
- Android自定义组合控件--EditText和Button组合成带有清空EditText内容功能的复合控件
目标:实现EditText和Button组合成带有清空EditText内容功能的复合控件,可以通过代码设置自定义控件的相关属性. 实现效果为: (1)在res/layout目录下编写自定义组合控件的布 ...
- Android开发学习笔记-自定义组合控件
为了能让代码能够更多的复用,故使用组合控件.下面是我正在写的项目中用到的方法. 1.先写要组合的一些需要的控件,将其封装到一个布局xml布局文件中. <?xml version="1. ...
最新文章
- python工作好找吗-python工作好找吗
- linux 系统 UDP 丢包问题分析思路
- php如何加载ffmpeg库,安装php扩展 ffmpeg-php
- XCoreRedux框架:Android UI组件化与Redux实践
- CentOS 5打造全功能Web服务器
- [一文一命令]ln命令详解
- 怎么调整矩形边框宽度_Illustrator实例教程:利用自定义画笔绘制中国风传统边框...
- C1 WPF C1FlexGrid设置样式技巧:单元格设置背景色
- app架构师实践指南pdf,分享一些行业经验,看完这一篇你就懂了
- 如何使用patch命令打补丁
- 本周开课 | 10年运营专家亲授,掌握9类运营的核心技能,强化运营实力
- 怎么把照片一键生成漫画图?照片生成漫画方法分享。​
- 书写阿拉伯数字 0、1、2、3、4、5、6、7、8、9
- JavaScript和jQuery的基础知识和使用
- android 定时推送提醒,使用workManager实现每日定时推送通知
- 第七届iWeb峰会(HTML5峰会)议程曝光
- (二)强网杯2019[随便注]
- 想精通 Python 数据挖掘?清华博士带你入门!
- jsp内置对象的方法调用无效报错
- 一文深度剖析扩散模型究竟学到了什么?
热门文章
- smartdraw 2008 成功安装
- 生物信息学(Bioinformatics)
- 一些自己关注的人工智能杂志(注意:这里所列的影响因子是08年的IF)
- java的annotation_Java Annotation认知(包括框架图、详细介绍、示例说明)
- python读txt文件 数组-python将txt等文件中的数据读为numpy数组的方法
- linux 目标文件格式,Linux工具 - NM目标文件格式分析
- 本地mysql备份至rds_阿里云RDS备份在本地mysql快速还原
- 住宅区和住宅建筑内光纤到户通信设施工程设计规范_山西开展综合布线系统工程设计 验收规范专题培训...
- python读excel并写入_python 读取excel文件并写入json
- matlab中fprintf函数的具体使用方法