首页 > 学院 > 开发设计 > 正文

菜鸟笔记的第一天,自定义View(组合控件)

2019-11-09 15:42:04
字体:
来源:转载
供稿:网友

~~~~新的一年已经开始,每个人都做好了自己的人生规划,开启了新的航程。回过头来,我发现做程序员已经有四五年的光景了,可是扪心自问,我并没有从菜鸟进化成大牛。所以趁我还年轻,我决定改变我现在的生活状态,我希望能像鸿神所说的那样,通过写文章来让自己变得很厉害。 大家有没有发现,很多技术点我们用起来很6,但是却总是遇到奇奇怪怪的bug或者问题,在面试的时候如果面试官让你去讲,很有可能讲两三分钟就讲完了,而且答的并不理想。最根本的原因就是,我们并没有完全get这个点。如果你再去研究,肯定会有意想不到的收获。 扯淡扯了这么久,下面开始进入正题。


Android自定义View主要包括3种实现方式:组合控件、绘制控件、继承控件。那今天我呢就主要来聊一下组合控件吧~第一步,当然是画布局页面了<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/ds_30" android:paddingRight="@dimen/ds_30" android:layout_marginBottom="@dimen/ds_3" android:gravity="center_vertical" android:orientation="horizontal" android:background="#fff"> <ImageView android:id="@+id/mine_item_img" android:layout_width="@dimen/ds_81" android:layout_height="@dimen/ds_81" android:background="@mipmap/ic_launcher" android:layout_centerVertical="true" /> <TextView android:id="@+id/mine_item_title" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:layout_centerVertical="true" android:layout_marginLeft="@dimen/ds_30" android:layout_toRightOf="@+id/mine_item_img" android:text="标题" android:textColor="#333" android:textSize="@dimen/fs_45" /> <TextView android:id="@+id/mine_item_count" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="@dimen/ds_30" android:layout_toRightOf="@+id/mine_item_img" android:text="1" android:textColor="#999" android:textSize="@dimen/fs_42" /> <ImageView android:id="@+id/mine_item_next" android:layout_width="@dimen/ds_42" android:layout_height="@dimen/ds_42" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:background="@mipmap/icon_more" /></LinearLayout>四个元素横向排布,分别是菜单图标、标题、标签、进入图标,这个不多说第二步,values目录下创建一个属性文件attrs.xml,并创建标签添加自定义属性,这里我自定义了菜单图标、标题和数量,当然我们还可以自定义字号、颜色等等: <declare-styleable name="MineItemView"> <attr name="leftImg" format="reference"/> <attr name="title" format="string"/> <attr name="count" format="string"/> </declare-styleable>第三步,创建一个类 MineItemView.class,继承该布局的父布局类型,从自定义的属性文件中取值并给控件赋值:public class MineItemView extends LinearLayout { PRivate TextView countView; //构造方法 public MineItemView(Context context) { super(context); } public MineItemView(Context context, AttributeSet attrs) { super(context, attrs); initView(context, attrs); } public MineItemView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(context, attrs); } //初始化View private void initView(Context context, AttributeSet attrs) { LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.widget_mine_item, this, true); ImageView leftImg = (ImageView) view.findViewById(R.id.mine_item_img); TextView titleView = (TextView) view.findViewById(R.id.mine_item_title); countView = (TextView) view.findViewById(R.id.mine_item_count); TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MineItemView); Drawable leftDrawable = typedArray.getDrawable(R.styleable.MineItemView_leftImg); String title = typedArray.getString(R.styleable.MineItemView_title); String count = typedArray.getString(R.styleable.MineItemView_count); typedArray.recycle(); if(leftDrawable == null){ leftDrawable = ContextCompat.getDrawable(context, R.mipmap.ic_launcher); } leftImg.setBackground(leftDrawable); if(TextUtils.isEmpty(title)){ title = ""; } titleView.setText(title); if(TextUtils.isEmpty(count)){ count = ""; } countView.setText(count); }第四步,在我们的主页面布局中引入自定义属性,添加自定义控件并给自定义的属性赋值:<?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" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" <com.bryan.app.MineItemView android:layout_width="match_parent" android:layout_height="@dimen/ds_144" app:leftImg="@mipmap/ic_launcher" app:count="8" app:title="我的消息" /><LinearLayout />

注意:xmlns:app=”http://schemas.android.com/apk/res-auto” 中的“app”可以随意命名,只需要控件中的与之对应即可。代码敲到这里,我们先喝杯咖啡,看看运行效果:

运行效果


很轻松愉快的我们就完成了一个实用的自定义View,当然我们可以用同样的方式做一些更复杂的View,今天就到这里吧~*初来乍到,一心向学,如有问题,烦请指正。*
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表