自定义控件Topbar、自定义属性attrs
来源:互联网 发布:mac改了用户名进不去 编辑:程序博客网 时间:2024/05/21 15:51
转载请注明出处:http://blog.csdn.net/mr_leixiansheng/article/details/70054221
相关文章: 自定义控件Topbar 升级版
作用:相同或者类似的UI高度封装,以后直接修改模版即可使用,解决代码复用
步骤:
(最先需要想好自己要构建什么样的控件及其属性有什么)
1、res / values 下添加 attrs 文件 设置自定义的属性和其输入格式
<?xml version="1.0" encoding="utf-8"?><resources> <!-- 自定义属性: 1、选好要定义的 属性 2、为属性设置好 格式 (标题、左按钮、右按钮:字体大小、颜色;背景;是否可见) --> <declare-styleable name="TopBar"> <attr name="title" format="string"/> </declare-styleable></resources>2、新建类继承 RelativeLayout
1)构造函数中将定义在 xml 中的属性属性取出
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TopBar);
//2、获取自定义的属性 title = typedArray.getString(R.styleable.TopBar_title);2)回收TypedArray
typedArray.recycle();3)拼合(并没有创建新的组件,只是拼合在一起)
tvTitle = new TextView(context); leftBtn = new Button(context); rightBtn = new Button(context);4) 将获取的自定义属性赋值给控件
tvTitle.setText(title);5) 设置控件宽度和位置,并添加到view中
titleParas = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); titleParas.addRule(RelativeLayout.CENTER_IN_PARENT); addView(tvTitle, titleParas);6)自定义监听
3、主布局中添加自定义View, 并添加以下代码,否则无法引入自定义属性。自由设置自定义View
xmlns:custom="http://schemas.android.com/apk/res-auto"4、主程序添加找到自定义控件,实现监听
代码如下:
1、res / values 下添加 attrs 文件 设置自定义的属性和其输入格式
<?xml version="1.0" encoding="utf-8"?><resources> <!-- 自定义属性: 1、选好要定义的 属性 2、为属性设置好 格式 (标题、左按钮、右按钮:字体大小、颜色;背景;是否可见) --> <declare-styleable name="TopBar"> <attr name="title" format="string"/> <attr name="titleSize" format="dimension"/> <attr name="titleColor" format="color"/> <attr name="titleVisiable" format="boolean"/> <attr name="leftText" format="string"/> <attr name="leftTextColor" format="color"/> <attr name="leftBackground" format="reference|color"/> <attr name="leftTextVisiable" format="boolean"/> <attr name="rightText" format="string"/> <attr name="rightTextColor" format="color"/> <attr name="rightBackground" format="reference|color"/> <attr name="rightTextVisiable" format="boolean"/> <attr name="topbarBackground" format="color"/> </declare-styleable></resources>2、新建类继承 RelativeLayout
package com.example.leixiansheng.topbar;import android.content.Context;import android.content.res.TypedArray;import android.graphics.drawable.Drawable;import android.os.Build;import android.support.annotation.RequiresApi;import android.util.AttributeSet;import android.view.Gravity;import android.view.View;import android.view.ViewGroup;import android.widget.Button;import android.widget.RelativeLayout;import android.widget.TextView;import android.widget.Toast;/** * Created by Leixiansheng on 2017/4/11. */public class TopBar extends RelativeLayout { /** * 定义属性元素(为了把自定义的属性都取出来,方便赋值给控件) */ private Button leftBtn,rightBtn; private TextView tvTitle; //title属性 private String title; private int titleColor; private float titleSize; private boolean titleVisiable; //leftBtn属性 private String leftText; private int leftTextColor; private Drawable leftBackground; private boolean leftTextVisiable; //rightBtn属性 private String rightText; private int rightTextColor; private Drawable rightBackground; private boolean rightTextVisiable; private int topbarBackground; private LayoutParams leftParams,rightParas,titleParas; private topbarClickListener listener; public interface topbarClickListener{ void leftClick(); void rightClick(); } public void setOnTopBarClickListener(topbarClickListener listener) { this.listener = listener; } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) public TopBar(final Context context, AttributeSet attrs) { super(context, attrs); //1、存储 xml获取的自定义属性 TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TopBar); //2、获取自定义的属性 title = typedArray.getString(R.styleable.TopBar_title); titleColor = typedArray.getColor(R.styleable.TopBar_titleColor,0xFFFFFFFF); //第二位默认 颜色 titleSize = typedArray.getDimension(R.styleable.TopBar_titleSize, 15f); //第二位默认 大小 titleVisiable = typedArray.getBoolean(R.styleable.TopBar_titleVisiable, true); //第二位默认 可见 leftText = typedArray.getString(R.styleable.TopBar_leftText); leftTextColor = typedArray.getColor(R.styleable.TopBar_leftTextColor, 0xffffffff); leftBackground = typedArray.getDrawable(R.styleable.TopBar_leftBackground); leftTextVisiable = typedArray.getBoolean(R.styleable.TopBar_leftTextVisiable, true); rightText = typedArray.getString(R.styleable.TopBar_rightText); rightTextColor = typedArray.getColor(R.styleable.TopBar_rightTextColor, 0xffffffff); rightBackground = typedArray.getDrawable(R.styleable.TopBar_rightBackground); rightTextVisiable = typedArray.getBoolean(R.styleable.TopBar_rightTextVisiable, true); topbarBackground = typedArray.getColor(R.styleable.TopBar_topbarBackground,0xFFF59563); //3、记得回收TypedArray typedArray.recycle(); //4、拼合(并没有创建新的组件,只是拼合在一起) tvTitle = new TextView(context); leftBtn = new Button(context); rightBtn = new Button(context); //5、将获取的自定义属性赋值给控件 tvTitle.setText(title); tvTitle.setTextColor(titleColor); tvTitle.setTextSize(titleSize); tvTitle.setGravity(Gravity.CENTER); if (!titleVisiable) { tvTitle.setVisibility(View.GONE); } leftBtn.setText(leftText); leftBtn.setTextColor(leftTextColor); leftBtn.setBackground(leftBackground); if (!leftTextVisiable) { leftBtn.setVisibility(View.GONE); } rightBtn.setText(rightText); rightBtn.setTextColor(rightTextColor); rightBtn.setBackground(rightBackground); if (!rightTextVisiable) { rightBtn.setVisibility(View.GONE); } setBackgroundColor(topbarBackground); //6、设置控件宽度和位置,并添加到view中 titleParas = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); titleParas.addRule(RelativeLayout.CENTER_IN_PARENT); addView(tvTitle, titleParas); leftParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, TRUE); addView(leftBtn, leftParams); rightParas = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); rightParas.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, TRUE); addView(rightBtn, rightParas); //7、自定义监听 leftBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { listener.leftClick(); } }); rightBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { listener.rightClick(); } }); } /** * 选择控件可见 */// public void setTvTitleisVisable(boolean flag) {// if (flag) {// tvTitle.setVisibility(View.VISIBLE);// } else {// tvTitle.setVisibility(View.GONE);// }// }//// public void setLeftBtnisVisable(boolean flag) {// if (flag) {// leftBtn.setVisibility(View.VISIBLE);// } else {// leftBtn.setVisibility(View.GONE);// }// }//// public void setRightBtnisVisable(boolean flag) {// if (flag) {// rightBtn.setVisibility(View.VISIBLE);// } else {// rightBtn.setVisibility(View.GONE);// }// }}3、主布局中添加自定义View, 并添加以下代码,否则无法引入自定义属性。自由设置自定义View
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="10dp" android:paddingRight="5dp" android:paddingLeft="5dp" android:orientation="vertical" tools:context="com.example.leixiansheng.topbar.MainActivity"> <com.example.leixiansheng.topbar.TopBar android:id="@+id/topbar1" android:layout_width="match_parent" android:layout_height="40dp" custom:title="自定义标题" custom:titleSize="15dp" custom:titleColor="#ffffffff" custom:leftBackground="@color/colorPrimary" custom:leftText="返回" custom:leftTextColor="#ffffffff" custom:rightBackground="@color/colorPrimary" custom:rightText="菜单" custom:rightTextColor="#ffffffff"> </com.example.leixiansheng.topbar.TopBar> <com.example.leixiansheng.topbar.TopBar android:id="@+id/topbar2" android:layout_marginTop="15dp" android:layout_width="match_parent" android:layout_height="40dp" custom:topbarBackground="#000000" custom:title="联系人" custom:titleSize="10dp" custom:titleColor="#ffffffff" custom:leftBackground="#000000" custom:leftText="返回" custom:leftTextColor="#ffffffff" custom:rightBackground="#000000" custom:rightText="联系人" custom:rightTextColor="#ffffffff"> </com.example.leixiansheng.topbar.TopBar> <com.example.leixiansheng.topbar.TopBar android:id="@+id/topbar3" android:layout_marginTop="15dp" android:layout_width="match_parent" android:layout_height="40dp" custom:topbarBackground="#000000" custom:title="动态" custom:titleSize="10dp" custom:titleColor="#ffffffff" custom:leftBackground="@mipmap/ic_launcher" custom:leftTextColor="#ffffffff" custom:rightBackground="#000000" custom:rightText="更多" custom:rightTextColor="#ffffffff"> </com.example.leixiansheng.topbar.TopBar> <com.example.leixiansheng.topbar.TopBar android:id="@+id/topbar4" android:layout_marginTop="15dp" android:layout_width="match_parent" android:layout_height="40dp" custom:topbarBackground="@color/colorAccent" custom:title="自由发挥" custom:titleSize="10dp" custom:titleColor="#ffffffff" custom:leftText="自由发挥" custom:leftTextColor="#ffffffff" custom:rightText="自由发挥" custom:rightTextColor="#ffffffff"> </com.example.leixiansheng.topbar.TopBar></LinearLayout>4、主程序添加找到自定义控件,实现监听
package com.example.leixiansheng.topbar;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.Toast;public class MainActivity extends AppCompatActivity implements TopBar.topbarClickListener{ private TopBar topBar1,topBar2,topBar3,topBar4; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); topBar1 = (TopBar) findViewById(R.id.topbar1); topBar2 = (TopBar) findViewById(R.id.topbar2); topBar3 = (TopBar) findViewById(R.id.topbar3); topBar4 = (TopBar) findViewById(R.id.topbar4); topBar1.setOnTopBarClickListener(this); topBar2.setOnTopBarClickListener(this); topBar3.setOnTopBarClickListener(this); topBar4.setOnTopBarClickListener(this); topBar1.setOnTopBarClickListener(new TopBar.topbarClickListener() { @Override public void leftClick() { Toast.makeText(MainActivity.this, "默认", Toast.LENGTH_SHORT).show(); } @Override public void rightClick() { Toast.makeText(MainActivity.this, "默认", Toast.LENGTH_SHORT).show(); } }); topBar4.setOnTopBarClickListener(new TopBar.topbarClickListener() { @Override public void leftClick() { Toast.makeText(MainActivity.this, "自由发挥", Toast.LENGTH_SHORT).show(); } @Override public void rightClick() { Toast.makeText(MainActivity.this, "自由发挥", Toast.LENGTH_SHORT).show(); } }); } //另一种监听,可根据需求自行选择 @Override public void leftClick() { Toast.makeText(MainActivity.this, "返回", Toast.LENGTH_SHORT).show(); } @Override public void rightClick() { Toast.makeText(MainActivity.this, "菜单", Toast.LENGTH_SHORT).show(); }}
0 0
- 自定义控件Topbar、自定义属性attrs
- 自定义控件attrs属性介绍
- Android自定义控件使用attrs属性
- 自定义控件涉及到的attrs属性详解
- 自定义控件学习Topbar
- 自定义控件之TopBar
- 自定义组合控件TopBar
- 自定义控件之-TopBar
- 自定义组合控件TopBar
- Android自定义属性attrs
- android自定义属性attrs
- 自定义控件 attrs.xml
- android中自定义的控件,使用自定义属性attrs.xml
- 自定义TopBar和属性封装
- Android Topbar(自定义组合控件)
- 自定义控件topbar实现步骤
- 自定义控件Topbar 升级版
- 自定义控件属性TypedArray和attrs.xml和AttributeSet
- 使用Unity制作的一个望远镜特效
- 信息时代,书香更宜人
- 机器学习(Machine Learning)&深度学习(Deep Learning)资料
- 百度地图 滑动地图获取中心点周围位置信息(首次进来显示所在定位位置)
- Windows与Linux各占鳌头!
- 自定义控件Topbar、自定义属性attrs
- libpcap编程(2)DPDK下的数据包捕获
- STAR法则写简历
- MyEclipse开发中,全局编码设置为UTF-8
- ReactNative全屏图片背景技巧
- 在windows远程提交任务给Hadoop集群(Hadoop 2.6)
- springmvc 集成activemq引入activemq-all-5.14.4有冲突
- 使用Phoenix连接Hbase
- java学习 八、循环语句 while循环