首页 > 其他分享 >安卓自定义控件快速了解

安卓自定义控件快速了解

时间:2023-11-11 17:33:05浏览次数:42  
标签:控件 自定义 tv 安卓 视图 Test id

自定义控件,自定义视图方式,

假设我们写好一个视图,就以这个视图封装起来做成一个组件,这个自定义的控件就想当方便以后相同功能时直接调用

这个核心分为三步,第一步编写一个类继一个视图,这个继承的视图比如​RelativeLayout​,除了 ​RelativeLayout​以外,Android 还提供了其他一些常用的布局类,如:

  • ​LinearLayout​: 用于在水平或垂直方向上排列子视图。
  • ​FrameLayout​: 以相对位置的方式定位单个子视图。
  • ​ConstraintLayout​: 通过使用约束条件在更复杂的布局中定位子视图。

当选择继承哪个布局类时,您可以根据您的布局需求和设计选择最适合的父类。在更高级的自定义视图的时候,如果是绘制还可以继承view 然后用canvas 来绘制控件

第二步,给这个类编写一个视图xml 文件,只是如果是RelativeLayout​上绑定响就要可以在组件上增加属性。android:clickable="true" 否则点击没有反应。最后在需要使用这个组件的时候,引用类路径的方法使用控件就完成,

 但是是自定义控件,我们就要会动态设置值,如果值写就没有意义了,关于动态设置值,第一步在自定义组件中,先用id 获取资源,然后编写一个函数设置值,最后在主函数调用方法传入值,

自定义控件中这义如下:

  public Test(Context context, AttributeSet attrs) {
        super(context, attrs);
        LayoutInflater.from(context).inflate(R.layout.test_view,this);
        tv_l = (TextView)findViewById(R.id.tvLeft);
        tv_R = (TextView)findViewById(R.id.tvReft);
        tv_arr = (ImageView)findViewById(R.id.tvArror);
    }
    public void setView(String tvLeftStr, String tvRight, boolean isShowArr){
        if(tvLeftStr != null){
            tv_l.setText(tvLeftStr);
        }
        if(tvRight != null){
            tv_R.setText(tvRight);
        }
        if(isShowArr){
            tv_arr.setVisibility(View.VISIBLE);
        }else{
            tv_arr.setVisibility(View.GONE);
        }
    }

  主函数中就可以调接设置值

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       Test tv1 = (Test) findViewById(R.id.tv1);
       Test tv2 = (Test) findViewById(R.id.tv2);
       Test tv3 = (Test) findViewById(R.id.tv3);
        tv2.setView("555","444",true);
        tv3.setView("6666","66",false);
        tv1.setView("ddd","ddd",true);

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

当然也可以通过配置文件传值,通过自定义属,步聚分为三步,第一步编写一个arrts 自定义属生文件,第二步是在使用自定义控件引用的地方增加自定属性的值,第三步在自定义控件的文件中获取配置文件的属生和和值,以下是详细步聚

第一步编写attas文件,位于res 资源目录values目录下面,和colors,string。xml同级

<resources>
    <declare-styleable name="ItemView">
        <attr name="leftText" format="string" />
        <attr name="rightText" format="string" />
        <attr name="showArrow" format="boolean" />
    </declare-styleable>
</resources>

第二步在引用的地方配置值,这儿会提法增加命名空间,否则不识别

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="wrap_content"
    android:layout_height="wrap_content"
    xmlns:ItemView="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <com.example.myapplication.Test
        android:id="@+id/tv1"
        ItemView:leftText="姓名"
        ItemView:rightText="xxxxxxxxx"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <com.example.myapplication.Test
        android:id="@+id/tv2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <com.example.myapplication.Test

 

第三步,在自定义控件的代码中增加获取和配置



package com.example.myapplication;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class Test extends RelativeLayout {
private final TextView tv_l;
private final TextView tv_R;
private final ImageView tv_arr;
public Test(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.test_view,this);
tv_l = (TextView)findViewById(R.id.tvLeft);
tv_R = (TextView)findViewById(R.id.tvReft);
tv_arr = (ImageView)findViewById(R.id.tvArror);
d //获取资源名,第二个参数itemView是自定义属生那儿设置的
TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.ItemView);
String l = a.getString(R.styleable.ItemView_leftText);
String r = a.getString(R.styleable.ItemView_rightText);
boolean showArr = a.getBoolean(R.styleable.ItemView_showArrow,true);
setView(l,r,showArr);

}
public void setView(String tvLeftStr, String tvRight, boolean isShowArr){
if(tvLeftStr != null){
tv_l.setText(tvLeftStr);
}
if(tvRight != null){
tv_R.setText(tvRight);
}
if(isShowArr){
tv_arr.setVisibility(View.VISIBLE);
}else{
tv_arr.setVisibility(View.GONE);
}
}

标签:控件,自定义,tv,安卓,视图,Test,id
From: https://www.cnblogs.com/ZzwWan/p/17809664.html

相关文章

  • 如何自定义TAPD缺陷模板?
    一、引言现在不少公司使用TAPD,创建缺陷时,系统默认模板是一片空白。其实缺陷有较为固定的模板,设置好模板,就可以免去每次重复敲一些文字。二、设置模板进入设置的路径:设置--》应用设置--》缺陷--》显示设置--》创建页面模板--》新增创建页面模板进入页面后,根据自己的需要,编......
  • pyqt5-自定义函数优化管理组件
    1、介绍pyqt本身提供了诸多的方法和事件特性,可以操作ui组件。对于单一的项目或者说具有个人风格的开发者来说,在此基础上进行整合可以优化代码。整合,这里特指的是ui组件。可能是ui的显示和初始化,也可能是相关的业务代码。2、测试和总结函数中的ui组件可以调用设置值或获取的......
  • pyqt5-自定义类管理组件
    1、直接定义类,类对象作为XxWindowClass的属性,和self.window并列。将self.window的部分组件赋值给自定义类的属性,完成同步。经测试,此时自定义类的对象中可以读取和操作ui组件。但是无法进行事件设置,设置无效。2、解决方法目前有两个解决方法2.1继续1的做法,自定义类的对象与sel......
  • WPF控件设计艺术1按钮与自定义控件设计总结
    框架.NET6.0编译器:vsCommunity2022基于C#大致框架代码分享纯文本按钮TextOnlyButton资源字典分享<ResourceDictionaryxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">......
  • 直播会议一体机主板|5G智能会议一体机安卓主板方案介绍
    5G直播会议一体机主板采用了强大的音视频输入输出,内置安卓13系统,适用于多种直播和会议软件,广泛应用于智能会议一体机、便携直播机、录播导播、无人直播、视频传输等多种领域。该主板采用国产6nm旗舰芯片紫光展锐T820处理器,提供了4+64G、6+128G、8+256G多种内存版本可选。在无线连接......
  • PyQt5-QLabel控件是什么?方法有哪些?具体如何使用?
    (QLabel控件是什么?方法有哪些?具体如何使用?)1QLabel控件作用?QLabel控件用于显示不可编辑的文本或图片,也用于设置超链接、富文本,以及作为其他控件的;QLabel控件是PyQt5是一个非常常用又非常基础的一个控件。2QLabel源码源码路径:PyQt5\QtWidgets\QLabel.py部分源码:cla......
  • django中数据库外键可以自定义名称吗
    是的,在Django中,你可以自定义数据库外键的名称。在定义模型时,可以使用`db_constraint`参数来设置外键的约束名称。默认情况下,Django会自动生成外键约束的名称,但你可以通过设置`db_constraint`参数为`False`来禁用自动生成的约束,并且在需要时手动为外键指定名称。以下是一个简单的例......
  • 自定义注解
    1、类注解/***需要动态查询CodeTable数据字典时,在类上配置该注解*/@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceCodeAnnotation{}2、字段注解/***需要动态查询CodeTable数据字典时,在对应str属性上配置该注解......
  • layer.load底部添加自定义文字(文字居中效果)
    varindex=layer.load(2,{shade:[0.3,'#000'],success:function(layero){layero.find('.layui-layer-content').after('<divclass="layer-load">加载中...</div>'); layero.find('.la......
  • 实现MyBatisPlus自定义sql注入器
    目标:新增mysql下的插入更新的语法INSERTINTO%s%sVALUES%sONDUPLICATEKEYUPDATE%s新增方法类,新增的方法名称为insertOrUpdate和insertOrUpdateBatch方法,但其mapper层的方法名为insertOrUpdate方法importcom.baomidou.mybatisplus.annotation.IdType;importcom.b......