在xml中自定义app属性

本次demo属于自定义控件中的组合控件 关于自定义控件详细可参考
https://www.jianshu.com/p/705a6cb6bfee
最终效果图:

  • 1.定义自定义xml的布局(两个image 两个text)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/leftImage"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentStart="true" /><TextViewandroid:id="@+id/mainText"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_toEndOf="@id/leftImage" /><TextViewandroid:id="@+id/secondaryText"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/mainText"android:layout_toEndOf="@id/leftImage" /><ImageViewandroid:visibility="gone"android:id="@+id/rightImage"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentEnd="true" /></RelativeLayout>
  • 2.新建attrs.xml 并新建供自定义view 使用的属性
<?xml version="1.0" encoding="utf-8"?>
<resources><declare-styleable name="CustomListItem"><attr name="rightButtonVisible" format="boolean" /><attr name="leftButtonImage" format="reference|color" /><attr name="mainTextSize" format="dimension" /><attr name="mainTextContent" format="string" /><attr name="secondaryTextContent" format="string" /><attr name="rightButtonImage" format="reference|color" /><attr name="leftButtonMargin" format="dimension" /><attr name="mainTextMargin" format="dimension" /><attr name="secondaryTextMargin" format="dimension" /></declare-styleable>
</resources>
  • 3.为自定义view组合创建对应的java文件 并在此读取xml中的属性 赋值到对应的view中
package com.example.testfragment.ui.main;import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;import com.example.testfragment.R;public class CustomListItem extends RelativeLayout {private ImageView leftImage;private TextView mainText;private TextView secondaryText;private ImageView rightImage;//value saved from xml,this is optional, you can also not save those valueprivate Drawable leftButtonImage;private String mainTextContent;private float mainTextSize;private String secondaryTextContent;private boolean rightButtonVisible;private int leftButtonMargin;private int mainTextMargin;private int secondaryTextMargin;private Drawable rightButtonImage;public CustomListItem(Context context, AttributeSet attrs) {//will call this method in xml initializesuper(context, attrs);initItemLayout(attrs);}private void initItemLayout(AttributeSet attrs) {Context context = getContext();View view = LayoutInflater.from(context).inflate(R.layout.item, this, true);if (view != null) {leftImage = view.findViewById(R.id.leftImage);mainText = view.findViewById(R.id.mainText);secondaryText = view.findViewById(R.id.secondaryText);rightImage = view.findViewById(R.id.rightImage);}TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CustomListItem);if (leftImage != null) {leftButtonImage = ta.getDrawable(R.styleable.CustomListItem_leftButtonImage);leftButtonMargin = ta.getDimensionPixelSize(R.styleable.CustomListItem_leftButtonMargin, 0);if (leftButtonImage != null) {leftImage.setImageDrawable(leftButtonImage);}ViewGroup.LayoutParams params = leftImage.getLayoutParams();ViewGroup.MarginLayoutParams marginParams;if (params instanceof ViewGroup.MarginLayoutParams) {marginParams = (ViewGroup.MarginLayoutParams) params;} else {marginParams = new ViewGroup.MarginLayoutParams(params);}marginParams.setMargins(leftButtonMargin, leftButtonMargin, leftButtonMargin, leftButtonMargin);leftImage.setLayoutParams(params);}if (mainText != null) {mainTextContent = ta.getString(R.styleable.CustomListItem_mainTextContent);mainTextSize = ta.getDimensionPixelSize(R.styleable.CustomListItem_mainTextSize, 0);mainTextMargin = ta.getDimensionPixelSize(R.styleable.CustomListItem_mainTextMargin, 0);mainText.setText(mainTextContent);mainText.setTextSize(mainTextSize);ViewGroup.LayoutParams params = mainText.getLayoutParams();ViewGroup.MarginLayoutParams marginParams;if (params instanceof ViewGroup.MarginLayoutParams) {marginParams = (ViewGroup.MarginLayoutParams) params;} else {marginParams = new ViewGroup.MarginLayoutParams(params);}marginParams.setMargins(mainTextMargin, mainTextMargin, mainTextMargin, mainTextMargin);mainText.setLayoutParams(params);}if (secondaryText != null) {secondaryTextContent = ta.getString(R.styleable.CustomListItem_secondaryTextContent);secondaryTextMargin = ta.getDimensionPixelSize(R.styleable.CustomListItem_secondaryTextMargin, 0);secondaryText.setText(secondaryTextContent);ViewGroup.LayoutParams params = secondaryText.getLayoutParams();ViewGroup.MarginLayoutParams marginParams;if (params instanceof ViewGroup.MarginLayoutParams) {marginParams = (ViewGroup.MarginLayoutParams) params;} else {marginParams = new ViewGroup.MarginLayoutParams(params);}marginParams.setMargins(secondaryTextMargin, secondaryTextMargin, secondaryTextMargin, secondaryTextMargin);secondaryText.setLayoutParams(params);}if (rightImage != null) {rightButtonVisible = ta.getBoolean(R.styleable.CustomListItem_rightButtonVisible, false);rightButtonImage = ta.getDrawable(R.styleable.CustomListItem_rightButtonImage);if (rightButtonImage != null) {rightImage.setImageDrawable(rightButtonImage);}rightImage.setVisibility(rightButtonVisible ? VISIBLE : GONE);}}//we can also add public method to control leftImage,mainText,secondaryText,rightImage in Java code
}
  • 4.前期工作完工 在xml中 使用自定义view
<?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"android:orientation="vertical"tools:context=".MainActivity"><com.example.testfragment.ui.main.CustomListItemandroid:id="@+id/custom"android:layout_width="wrap_content"android:layout_height="wrap_content"app:leftButtonImage="@drawable/coffee_icon"app:mainTextContent="This is main text"app:mainTextSize="30sp"app:secondaryTextContent="This is secondary text"app:rightButtonVisible="true"app:leftButtonMargin="40dp"app:mainTextMargin="10dp"app:secondaryTextMargin="20dp"app:rightButtonImage="@drawable/coffee_icon"/><com.example.testfragment.ui.main.CustomListItemandroid:layout_below="@id/custom"android:id="@+id/custom2"android:layout_width="wrap_content"android:layout_height="wrap_content"app:leftButtonImage="@drawable/ic_launcher"app:mainTextContent="This is main text2222"app:mainTextSize="50sp"app:secondaryTextContent="This is secondary text222"app:rightButtonVisible="false"app:leftButtonMargin="50dp"app:mainTextMargin="50dp"app:secondaryTextMargin="20dp"app:rightButtonImage="@drawable/ic_launcher"/></RelativeLayout>
  • 5.MainActivity
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main_activity);}}

在xml中自定义属性 app相关推荐

  1. Android中自定义属性(attrs.xml,TypedArray的使用)

    做Android布局是件很享受的事,这得益于他良好的xml方式.使用xml可以快速有效的为软件定义界面.可是有时候我们总感觉官方定义的一些基本组件不够用,自定义组件就不可避免了.那么如何才能做到像官方 ...

  2. XML中配置网易云歌手详情滑动效果

    本文由 imurluck 授权投稿 原文链接:https://blog.csdn.net/z1289042324/article/details/90447669 HeaderLayout 网易云音乐 ...

  3. Android-0.PMS简介及VirtualApp中安装App全流程

    文章目录 1.Package Manager简介 2.PackageInstaller简介 2.1 PackageInstaller初始化 2.2 PackageInstaller安装APK 3. P ...

  4. 【Interfacenavigation】XML中的字体(27)

    原 Android 8.0(API级别26)引入了一项新功能,即XML中的字体,它允许您将字体用作资源.您可以在font文件res/font/夹中添加文件以将字体捆绑为资源.这些字体在您的R文件中编译 ...

  5. 在.NET中从app.config或web.config读取设置

    我正在使用一个C#类库,该类需要能够从web.config或app.config文件中读取设置(取决于DLL是从ASP.NET Web应用程序还是Windows Forms应用程序引用的). 我发现 ...

  6. phonegap工程中修改app的名字

    针对phonegap比较高的版本,我的是6.4.0. 在phonegap工程中,当添加了iOS和android平台或多个平台后,工程进行了开发,然后觉得app的名字想修改一下(比如在手机上显示的app ...

  7. Android中点击按钮获取string.xml中内容并弹窗提示

    场景 AndroidStudio跑起来第一个App时新手遇到的那些坑: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103797 ...

  8. EcStore中的App是什么东西?

    Ecstore中的App不是手机上的App,它是一个Web应用包,集合了Web应用的后端PHP程序.Mysql数据表定义,以及前端HTML+CSS+JS展现,通常是实现某个业务功能,如购物车.促销.支 ...

  9. DataBinding 学习系列(2)详解DataBinding在xml中的使用

    #前言# 上一篇简单的介绍了DataBinding的用法,这几篇来仔细的介绍一下的功能. #data 标签 的功能# <data class="test"></d ...

最新文章

  1. javascript网页开发 第二章
  2. Linux下paste命令详解
  3. 发布CodeBuild.Net代码自动生成器 V2008 2.01(Vs2008)和架构实例源码Demo
  4. java类中serialversionuid 作用 是什么?举个例子说明
  5. ARC079F - Namori Grundy(构造,基环树)
  6. 什么是线程安全,你真的了解吗
  7. python更新后yum问题
  8. 奇妙华为3c手机, 出现安装未成功问题。
  9. c语言 给结构体赋初值,c/c++ 结构体赋初值的小技巧
  10. python 深度 视差 计算_2,Learn about Parallax(视差贴图)
  11. Mac下安装Flink的local模式(flink-1.0.2)
  12. Python学生信息管理系统的开发
  13. Java Web提交参数到Spark集群执行任务
  14. paip.c#.net自定义图像窗体form
  15. 企业级POS收银系统源码(客户端+后台)
  16. 以太坊-区块链开发入门
  17. 西安电子科技大学计算机学院保研政策,西安电子科技大学计算机学院(专业学位)计算机技术保研条件...
  18. 斐讯天天链N1:分布式数据存储模式能否引领下一代数据中心变革
  19. 双亲委派模型是什么?
  20. html的毕业设计步骤和方法,毕业论文写作的8大步骤

热门文章

  1. 上海教育系统计算机职称考试报名,2008年第二季度上海市教育系统职称计算机考试报名的通知...
  2. 小程序 图片上传php后台,微信小程序图片选择、上传到服务器、预览(PHP)实现实例...
  3. Luogu1640 连续攻击游戏
  4. 【Linux】awk指令
  5. 《JAVA程序设计》第四周学习总结
  6. python 基于机器学习识别验证码
  7. win32常用文件操作
  8. ASA 5.0/8.0/9.0 杂记
  9. 博客迁移到github
  10. uva10256 凸包