组合控件的复用

C#之Winform自己创造复合控件——搜索控件(一) 何为搜索控件? 举个例子来说,就是像百度、搜狗、谷歌等界面的搜索栏,如下图所示。 跟据百度的搜索界面,我们得出思路,简单的来说,在Winform的工具箱找三个控件组成,首先选择Picturebox控件,在最上方添加LOGO图片,再添加一个Textbox控件作为用户输入内容的地方,同时在Textbox旁添加Picturebox控件作为拍照功能,再在最右方添加按钮控件进行搜索。 按照这个思路,我们首先第一步创建一个用户控件的类 将其重命名为SearchBox 第二步,将刚才思路所需控件添加到这个空白的布局 阅读详情



复用自定义控件组合控件


使用组合控件相比于直接在xml中写复用行比较强,如果在别的页面还要使用的话直接在Activity中调用就可以,减少无用工,提高工作效率

其实xml文件写的布局最终还是会自动转成java代码,减少机器的工作,提高速度,,反正就是好



需要生成的类和xml其中有两个是展示效果

MyRelativeLayout主要是写标题样式的、

BaseActivity是一个抽象类

MainActivity和Category是用来展示的






其中先写组合控件,也就是RelativeLayout



public class MyRelativeLayout extends RelativeLayout implements View.OnClickListener {

    private TextView textView;
    private ImageView back;



    public MyRelativeLayout(Context context) {
        this(context,null);
    }

    public MyRelativeLayout(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public MyRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    private void init(Context context) {
        LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        lp.addRule(RelativeLayout.CENTER_IN_PARENT);

        textView = new TextView(context);
        textView.setId(R.id.titleBar_id);
        textView.setText("标题");
        textView.setTextSize(25);
        textView.setTextColor(Color.BLUE);
        addView(textView,lp);
        textView.setOnClickListener(this);

        LayoutParams lp_img = new LayoutParams(100, 100);
        lp_img.addRule(RelativeLayout.ALIGN_LEFT);
        lp_img.addRule(RelativeLayout.CENTER_VERTICAL);
        lp_img.leftMargin = 10;

        back = new ImageView(context);
        back.setImageResource(R.mipmap.icon_back);
        addView(back,lp_img);


    }

    public TextView getTitle() {
        return textView;
    }

    public ImageView getBack() {
        return back;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.titleBar_id:
                Log.e("TAG",""+v.getId());
                break;
        }
    }
}

RelativeLayout就相当于布局文件,



BaseActivity是一个抽象类,这里使用到了多态

了解

https://www.cnblogs.com/jack204/archive/2012/10/29/2745150.html


多态其实就是父类的引用指向子类的实例,用相同的指令对不同的对象发送消息,不同的对象对相同的指令做出的反应


public abstract class BaseActivity extends AppCompatActivity {

    private MyRelativeLayout parent_title;
    private FrameLayout frameLayout;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.activity_base);
        initParentView();
        int id = this.setChildContentView();
        View childView = LayoutInflater.from(this).inflate(id, null);
        frameLayout.addView(childView);
        initView();
        initData();
    }




    private void initParentView() {
        frameLayout = findViewById(R.id.child_view);
        parent_title = findViewById(R.id.parent_title);
        parent_title.getBack().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                BaseActivity.this.finish();
            }
        });
    }

    public MyRelativeLayout getTitleBar(){
        return parent_title;
    }

    protected abstract int setChildContentView();
    protected abstract void initView();
    protected abstract void initData();
}

接着是BaseActivity的xml



<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">


    <com.title.MyRelativeLayout
        android:id="@+id/parent_title"
        android:layout_width="match_parent"
        android:background="@color/colorAccent"
        android:layout_height="56dp"/>

    <FrameLayout
        android:id="@+id/child_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"></FrameLayout>


</RelativeLayout>


MainActivity中

必须继承BaseActivity


public class MainActivity extends BaseActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }



    public void initView() {
        MyRelativeLayout titleBar = getTitleBar();
        TextView title = titleBar.getTitle();
        title.setText("主页");


        View viewById = findViewById(R.id.text1213);
        viewById.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,Category.class);
                startActivity(intent);
            }
        });
    }

    @Override
    protected int setChildContentView() {
        return R.layout.activity_main;
    }

    @Override
    protected void initData() {

    }
}



xml文件


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/text1213"
    android:text="12138"
    android:layout_centerInParent="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

</RelativeLayout>




Category中:


public class Category extends BaseActivity{
    @Override
    protected int setChildContentView() {
        return R.layout.activity_category;
    }

    @Override
    protected void initView() {
        MyRelativeLayout myRelativeLayout = getTitleBar();
        TextView textView = myRelativeLayout.getTitle();
        textView.setText("分类");
    }

    @Override
    protected void initData() {

    }
}



xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">

    <TextView
        android:text="嘿呦"
        android:layout_centerInParent="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>


因为是复用所以必须继承BaseActivity并重写方法,

其中内容可以在initView中自定义



RecyclerView 加载复杂多个多种布局,完美解决控件复用等等问题 RecyclerView 加载 adaper中创建并且加载布局 在activity 中调用adapter 的方法更新或者设置数据 立即下载

相关推荐

详细Ubuntu 22.04 配置最新UR机械臂仿真环境(ros2-humble, ur-sim, ur-ros2-driver)

使用ubuntu22.04.01和ur-sim, ur-driver进行ur机械臂的仿真

verloge的博客 1万+

C#界面编程3——复合控件

复合控件

qq_42832272的博客 576

PLCopen运动控制避坑指南:单轴功能块常见报错排查(基于SM3_Basic函数库)

本文深入解析PLCopen运动控制中单轴功能块的常见报错问题,基于SM3_Basic函数库提供实用排查指南。从功能块逻辑错误与硬件报错的甄别技巧到高频报错场景的解决方案,帮助工程师快速定位并解决运动控制系统中的稳定性问题,提升工业自动化设备的运行效率。

weixin_33686714的博客 314

C#(Winfrom)自定义控件--组合控件

本例是制作一个简单的自定义控件,然后用一个简单的测试程序, 对于初学者来说,本例子比较简单,只能起到抛石引玉的效果。 我也是在学习当中,今后会将自己所学的逐步写出来和大家交流共享。 创建自定义控件 第一步:创建控件库项目:MyControl 第二步:从工具箱中拖出1个TextBox和Button控件 设置背景为透明 在项目中添加一个Windows窗体程序 第三步:添加处理程序代码 PopControls中定义自定义控件的属性及button事件 using System; using System

weixin_42888250的博客 5699

NVIDIA驱动版本太低?手把手教你解决CUDA与PyTorch版本冲突问题

本文针对深度学习开发中常见的NVIDIA驱动版本过低导致的CUDA与PyTorch版本冲突问题,提供了从根源理解到实战解决的完整指南。文章详细解析了驱动、CUDA与PyTorch的依赖关系,并给出了升级驱动、降级PyTorch、使用Conda环境管理及Docker容器化四种核心解决方案,帮助开发者快速诊断并构建稳定的GPU开发工作流。

grpc6streamer的博客 968

手把手教你用STM32单片机控制双向可控硅调光(附完整代码+电路图)

本文提供了一套完整的STM32单片机控制双向可控硅实现灯光无级调光的实战方案。详细讲解了硬件电路设计,包括过零检测与隔离驱动,并剖析了基于定时器中断的软件核心逻辑,通过精准的相位角计算实现平滑的灯光强度控制。附有完整代码与电路图,适合嵌入式开发者实践。

weixin_29194255的博客 952

C# 用户控件之温度计

本文以一个用户控件【User Control】实现温度计的小例子,简述用户控件的相关知识,以供学习分享使用,如有不足之处,还请指正。 概述 一般而言,用户控件【User Control】,是在Visual Studio提供的默认控件不能满足实际的工作需要,才需要在现有控件的基础之上进行新的扩展,来实现自己的功能。用户控件有自己特有的属性,事件,方法来支撑特定的功能。用户控件封装实现的细节,可以...

weixin_34077371的博客 1422

时序定江山,功耗写风骨——解读时序库lib文件的奥义【芯片设计 lib文件】

lib库,全称liberty library format file:它是Liberty时序文件的简称,使用 Liberty 语法来编写。它可以通过library compiler/dc转换成.db文件(database),供synopsis家的DC和PT使用,也可以通过spyglass的library compiler来生成sglib文件,供spyglass使用。他们是等价的,但db文件是二进制格式,人类不可读。

LogicYarn的博客 2601

C#开发 WinForm如何在选项卡中集成加载多个窗体 实现窗体复用(图文)

最近需要做的一个项目,为了避免从菜单中选择的麻烦,需要把几个窗体集成到一起,通过TabControl选项卡来切换,这样的设计实现在一定程度上也是实现了代码的复用,扩展思路来说我们可以把一些小的功能做到窗体里在需要的时候在容器中加载即可,这样也可以避免使用用户控件时经常报错的问题。这个功能和之前做的一个通过菜单选择将窗体加载到选项卡中类似,不同的是激发的源头不同,我们来看一下吧。

XIAOFEIYU通达二开 3万+

Qt实现YOLO目标检测及其界面制作(附完整源码)

Qt实现YOLO目标检测及其界面制作(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 2738

ML307R OpenCPU TCP使用

实现现象 平台下发数据,板子在收到数据之后,马上再发送到平台,通过串口助手可以看到已经接收到数据。ML307R TCP 是使用LWIP的标准的socket通信,具体TCP流程可以自行百度。实验目的:实现把接收的数据再发送到服务端。因为是4G,所以必须用外网的。

面朝大海春暖花开 2232

Andriod 自定义控件之创建可以复用的组合控件

前面已学习了一种自定义控件的实现,是Andriod 自定义控件之音频条,还没学习的同学可以学习下,学习了的同学也要去温习下,一定要自己完全的掌握了,再继续学习,贪多嚼不烂可不是好的学习方法,我们争取学习了一种技术就会一种技术,而且不光看了就算了,最好的方法就是看完我自己再练习下,再扩展下,在原来的基础上在添加一些东西,比如,增加一些功能实现等等。 今天我们打算学习下另外一种自定义控件,就是创

wuji3390的博客 305

CodeX 登录报错 os error 10013?一键修复 CodeX 无法登录问题(亲测有效)

CodeX 登录时报 os error 10013?本文提供快速修复方案,实测有效,彻底解决登录报错:登录失败:failed to start login server: 以一种访问权限不允许的方式做了一个访问套接字的尝试。 (os error 10013)的问题💡

XiaoqiangClub的博客 2919

自定义控件之创建可以复用的组合控件(三)

今天我们打算学习下另外一种自定义控件,就是创建可重复使用的组合控件,那么问题来了: - **什么是可重复使用?** 就是在应用中,可以在多个地方共同使用一套代码。这样不仅能减少我们的工作量,而且还能保持应用风格的一致,这种应用最多最直接的体现就是统一风格样式的标题栏。 - **那什么又是组合控件呢?** 组合控件,顾名思义就是多个控件组合在一起,相互协作共同完成某些特定的功能。

管满满 6808

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

android组合控件 重叠,Android 组合控件实现布局的复用的方法

看到很多项目会有实现自己的标题栏的做法,通常的界面是左边按钮或文字,加上中间的标题和右边的按钮或文字组成的。比较好的一种做法是使用include标签,复用同一个xml文件来实现布局的复用。但是这种方法是通过代码的方式来设置标题,左右按钮等其他的属性,会导致布局属性和Activity代码耦合性比较高。因此,我们要通过自定义View,继承ViewGroup子类来实现这样的布局,降低布局文件和Activ...

weixin_30970539的博客 500

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【安卓笔记】自定义view之组合控件

组合控件即将若干个系统已有的控件组合到一块形成一个组合控件,比如带返回按钮的标题栏就是一个最简单的组合控件。 使用组合控件的好处是提高代码的复用性,一处定义多处使用。 下面我们将使用组合控件实现这样的效果: 首先,我们需要自定义一个view: package com.example.widgets; import android.app.Activity; import

RowandJJ 2688

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

android 组件重用,Android 组合控件实现布局的复用的方法

看到很多项目会有实现自己的标题栏的做法,通常的界面是左边按钮或文字,加上中间的标题和右边的按钮或文字组成的。比较好的一种做法是使用include标签,复用同一个xml文件来实现布局的复用。但是这种方法是通过代码的方式来设置标题,左右按钮等其他的属性,会导致布局属性和Activity代码耦合性比较高。因此,我们要通过自定义View,继承ViewGroup子类来实现这样的布局,降低布局文件和Activ...

weixin_39683176的博客 310

Android 自定义组合控件

前言:        自定义组合控件可以提高布局的复用,降低开发成本,以及维护成本。我们在项目开发中经常会遇见很多相似或者相同的布局,比如APP的标题栏,我们从三种方式实现标题栏来对比自定义组件带来的好处,毕竟好的东西还是以提高开发效率,降低开发成本为导向的。一、直接在每个xml布局中写相同的标题栏布局代码&lt;?xml version="1.0" encoding="utf-8"?&gt; &...

WDF1114的博客 360

[Android学习笔记]组合控件的使用

组合控件的使用 开发过程中,多个UI控件需要协同工作,相互交互之后,才可完成一个完整的业务需求,此时可把这些控件封装成为一个整体,相互之间的交互逻辑封装其中,外部调用可无需关心内部逻辑,只需获取处理后的结果即可 创建组合控件步骤如下:1.创建xml布局,定义组合控件的外观2.定义组合控件类,此类一般继承原生ViewGroup控件,如:LinearLayout 3.在组合控件类中获取对应UI控件...

weixin_33912445的博客 101

android自定义组合控件

自定义组合控件可以实现布局的复用。可以将相同的组合布局写成一个自己的控件。方便自己在布局文件中使用 首先建立一个类。继承一个布局,比如RelativeLayout 然后在系统调用的构造方法里面初始化控件。 初始化控件: 首先用inflate填充生成一个View。然后增加View的控件,最后使用Viewgrouo的addView的方法添加View。 在布局文件中写上上面那个类的全路

explore555的博客 194

Android自定义控件之自定义组合控件(三)

前言:      前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一)、自定义属性Android自定义控件之自定义属性(二)。今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发成本,以及维护成本。 使用自定义组合控件的好处?     我们在项目开发中经常会遇见很多相似或者相同的布局,比如APP的标题栏,我们从三种方式实现标题栏来对比自定义组件带来的好处,

gxflh的博客 277

android自定义控件组合控件使用,Android自定义控件之自定义组合控件(三)

前言:前两篇介绍了自定义控件的基础原理Android自定义控件基本原理详解(一)、Android自定义控件之自定义属性(二)。今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发成本,以及维护成本。使用自定义组合控件的好处?我们在项目开发中经常会遇见很多相似或者相同的布局,比如APP的标题栏,我们从三种方式实现标题栏来对比自定义组件带来的好处,毕竟好的东西还是以提高开发效率,降低开发成...

weixin_30873333的博客 257

Android Studio自定义组合控件

在Android的开发中,为了能够服用代码,会把有一定共有特点的控件组合在一起定义成一个自定义组合控件。 本文就详细讲述这一过程。虽然这样的View的组合有一个粒度的问题。粒度太大了无法复用,粒度太小了又 达不到很好的复用的效果。不过,这些不在本文的讨论范围,需要读者自己去开发的实践中体会。 实例项目就选择一个登录注册的组件,这组件包括用户名、密码的文本输入框,还有登录和注册的按钮。这里 主...

weixin_33827965的博客 1097
上一篇: 自定义View (实现圆形旋转并跟随鼠标)
下一篇: RecyclerView的使用
Melect
博客等级 码龄9年 10粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值