用组合的方式自定义一个导航栏,功能:

左边个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_组合方式自定义控件相关推荐

  1. Android 自定义组合控件小结

    Android 自定义组合控件小结 引言 接触Android UI开发的这段时间以来,对自定义组合控件有了一定的了解,为此小结一下,本文小结内容主要讨论的是如何使用Android SDK提供的布局和控 ...

  2. android自定义控件中文乱码,Android笔记--自定义View之组合控件

    Android-自定义View 分享是最好的记忆-- 如需转发请注明出处 [强调]:共同学习 共同进步 不喜勿喷 内容简介 前言 实现 总结 1. 前言 这次更新有2个目的 1. 复用控件,而不是每次 ...

  3. android中的标题栏是什么意思,Android通用标题栏组合控件

    原标题:Android通用标题栏组合控件 快,点击蓝色"字体"关注这个公众号,一起涨姿势 由于项目中经常用到此种组合控件,就封装了下,具体效果看下图,老司机可以绕道哈! 一.主要功 ...

  4. Android 手机卫士--自定义组合控件构件布局结构

    由于设置中心条目中的布局都很类似,所以可以考虑使用自定义组合控件来简化实现 本文地址:http://www.cnblogs.com/wuyudong/p/5909043.html,转载请注明源地址. ...

  5. Android View体系(十)自定义组合控件

    相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源 ...

  6. android 中的组合控件的设计

    在开发应用程序的时候,很多时候会使用到几个重复的控件,例如Android手机的设置界面里面的位置服务里面的每一栏都是组合控件,也就是说多个控件组成一个整体,如下图所示: 红色方框里面的是由两个Text ...

  7. 《移动项目实践》实验报告——Android组合控件

    实验目的 1.熟悉App开发常用的一些组合控件,主要包括底部标签栏的实现和用法.顶部导航栏的用法.横幅轮播条的实现和用法.循环视图3种布局的用法.材质设计库3种布局的用法等: 实验内容 仿淘宝主页 上 ...

  8. Android自定义组合控件--EditText和Button组合成带有清空EditText内容功能的复合控件

    目标:实现EditText和Button组合成带有清空EditText内容功能的复合控件,可以通过代码设置自定义控件的相关属性. 实现效果为: (1)在res/layout目录下编写自定义组合控件的布 ...

  9. Android开发学习笔记-自定义组合控件

    为了能让代码能够更多的复用,故使用组合控件.下面是我正在写的项目中用到的方法. 1.先写要组合的一些需要的控件,将其封装到一个布局xml布局文件中. <?xml version="1. ...

最新文章

  1. python工作好找吗-python工作好找吗
  2. linux 系统 UDP 丢包问题分析思路
  3. php如何加载ffmpeg库,安装php扩展 ffmpeg-php
  4. XCoreRedux框架:Android UI组件化与Redux实践
  5. CentOS 5打造全功能Web服务器
  6. [一文一命令]ln命令详解
  7. 怎么调整矩形边框宽度_Illustrator实例教程:利用自定义画笔绘制中国风传统边框...
  8. C1 WPF C1FlexGrid设置样式技巧:单元格设置背景色
  9. app架构师实践指南pdf,分享一些行业经验,看完这一篇你就懂了
  10. 如何使用patch命令打补丁
  11. 本周开课 | 10年运营专家亲授,掌握9类运营的核心技能,强化运营实力
  12. 怎么把照片一键生成漫画图?照片生成漫画方法分享。​
  13. 书写阿拉伯数字 0、1、2、3、4、5、6、7、8、9
  14. JavaScript和jQuery的基础知识和使用
  15. android 定时推送提醒,使用workManager实现每日定时推送通知
  16. 第七届iWeb峰会(HTML5峰会)议程曝光
  17. (二)强网杯2019[随便注]
  18. 想精通 Python 数据挖掘?清华博士带你入门!
  19. jsp内置对象的方法调用无效报错
  20. 一文深度剖析扩散模型究竟学到了什么?

热门文章

  1. smartdraw 2008 成功安装
  2. 生物信息学(Bioinformatics)
  3. 一些自己关注的人工智能杂志(注意:这里所列的影响因子是08年的IF)
  4. java的annotation_Java Annotation认知(包括框架图、详细介绍、示例说明)
  5. python读txt文件 数组-python将txt等文件中的数据读为numpy数组的方法
  6. linux 目标文件格式,Linux工具 - NM目标文件格式分析
  7. 本地mysql备份至rds_阿里云RDS备份在本地mysql快速还原
  8. 住宅区和住宅建筑内光纤到户通信设施工程设计规范_山西开展综合布线系统工程设计 验收规范专题培训...
  9. python读excel并写入_python 读取excel文件并写入json
  10. matlab中fprintf函数的具体使用方法