Android 自定义TopBar的复用
2016-07-19 22:02
495 查看
自定义TopBar的复用
从来没发过关于android的技术文档,其实自己最近一个月都在学习java,但是感觉学java不学界面编程,没啥意思,所以傻傻的学了下AWT编程,结果发现这什么玩意啊,浪费青春,现在哪还有用java做pc端的呀,不说废话,赶紧学习android,不然这个月又白忙活了。
其实这个自定义TopBar呢,以前考核的时候基本上没时间去弄,因为要写很多属性,相信你看下面的一堆堆看似重复的代码会一脸懵X,其实也就是左按钮,标题,右按钮的属性设置,什么大小啊,字体颜色啊,字体大小啊,背景啊,统统都得写,所以才叫的上“自定义”嘛。我做得这么难看,相信你做得比我好。
/res/values/attrs.xml
<declare-styleable>:声明使用自定义属性,并通过name属性来确定引用的名称
<attr>:声明具体的自定义属性,标题文字字体、大小、颜色、背景
fomat:属性来指定属性的类型,多种属性可用”|“分隔开
XML文件
TopBar的代码实现
MainActivity
后续的乱入
通过include加入到其他布局
<include layout="@layout/topbar"/>
从来没发过关于android的技术文档,其实自己最近一个月都在学习java,但是感觉学java不学界面编程,没啥意思,所以傻傻的学了下AWT编程,结果发现这什么玩意啊,浪费青春,现在哪还有用java做pc端的呀,不说废话,赶紧学习android,不然这个月又白忙活了。
其实这个自定义TopBar呢,以前考核的时候基本上没时间去弄,因为要写很多属性,相信你看下面的一堆堆看似重复的代码会一脸懵X,其实也就是左按钮,标题,右按钮的属性设置,什么大小啊,字体颜色啊,字体大小啊,背景啊,统统都得写,所以才叫的上“自定义”嘛。我做得这么难看,相信你做得比我好。
/res/values/attrs.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="TopBar"> <attr name="titleText" format="string"/> <attr name="titleSize" format="dimension"/> <attr name="titleColor" format="color"/> <attr name="leftTextColor" format="color"/> <attr name="leftBackground" format="reference|color"/> <attr name="leftText" format="string"/> <attr name="rightTextColor" format="color"/> <attr name="rightBackground" format="reference|color"/> <attr name="rightText" format="string"/> </declare-styleable>
</resources>
<declare-styleable>:声明使用自定义属性,并通过name属性来确定引用的名称
<attr>:声明具体的自定义属性,标题文字字体、大小、颜色、背景
fomat:属性来指定属性的类型,多种属性可用”|“分隔开
XML文件
<?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" //这个表示下面可以用app开头,命名空间 android:layout_width="match_parent" android:orientation="vertical" android:layout_height="match_parent" > <com.android.rdc.view.TopBar android:id="@+id/topbar" android:layout_width="wrap_content" android:layout_height="wrap_content" app:leftText="返回" app:leftBackground="@color/colorPrimaryDark" app:leftTextColor="@color/colorAccent" app:rightText="下一步" app:rightTextColor="@color/colorAccent" app:rightBackground="@color/colorPrimaryDark" app:titleText="TopBar" app:titleColor="@color/colorAccent" app:titleSize="13sp" > </com.android.rdc.view.TopBar> </LinearLayout>
TopBar的代码实现
public class TopBar extends RelativeLayout { private int mLeftTextColor; private Drawable mLeftBackground; private String mLeftText; private int mRightTextColor; private Drawable mRightBackground; private String mRightText; private String mTitleText; private int mTitleColor; private float mTitleSize; private Button leftBtn; private LayoutParams leftParams; private Button rightBtn; private LayoutParams rightParams; private LayoutParams titleParams; private TopBarListener listener; public interface TopBarListener { //接口对象,实现回调机制,不考虑实现 public void leftClick(); public void rightClick(); } public void setListener(TopBarListener topBarListener) { this.listener = topBarListener; } public TopBar(Context context, AttributeSet attrs) { super(context, attrs); //系统提供了TypedArray数据结构来获取自定义属性集 TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.TopBar); mLeftTextColor = ta.getColor(R.styleable.TopBar_leftTextColor, 0); mLeftBackground = ta.getDrawable(R.styleable.TopBar_leftBackground); mLeftText = ta.getString(R.styleable.TopBar_leftText); mRightTextColor = ta.getColor(R.styleable.TopBar_rightTextColor, 0); mRightBackground = ta.getDrawable(R.styleable.TopBar_rightBackground); mRightText = ta.getString(R.styleable.TopBar_rightText); mTitleColor = ta.getColor(R.styleable.TopBar_titleColor, 0); mTitleSize = ta.getDimension(R.styleable.TopBar_titleSize, 10); mTitleText = ta.getString(R.styleable.TopBar_titleText); ta.recycle(); //当获取完所有的属性值后,要使用recycle()来完成资源的回收 leftBtn = new Button(context); leftBtn.setText(mLeftText); leftBtn.setTextColor(mLeftTextColor); leftBtn.setBackground(mLeftBackground); leftParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT); addView(leftBtn, leftParams); rightBtn = new Button(context); rightBtn.setText(mRightText); rightBtn.setTextColor(mRightTextColor); rightBtn.setBackground(mRightBackground); rightParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); rightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); addView(rightBtn, rightParams); TextView tvTitle = new TextView(context); tvTitle.setText(mTitleText); tvTitle.setTextColor(mTitleColor); tvTitle.setTextSize(mTitleSize); tvTitle.setGravity(Gravity.CENTER); titleParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); titleParams.addRule(RelativeLayout.CENTER_IN_PARENT); addView(tvTitle, titleParams); leftBtn.setOnClickListener(new OnClickListener() { //按钮的点击事件 @Override public void onClick(View view) { listener.leftClick(); } }); rightBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { listener.rightClick(); } }); } }
MainActivity
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); TopBar topBar = (TopBar) findViewById(R.id.topbar); topBar.setListener(new TopBar.TopBarListener() { //回调机制,实现按钮的点击 @Override public void leftClick() { Toast.makeText(MainActivity.this, "left", Toast.LENGTH_SHORT).show(); } @Override public void rightClick() { Toast.makeText(MainActivity.this, "right", Toast.LENGTH_SHORT).show(); } }); }
后续的乱入
通过include加入到其他布局
<include layout="@layout/topbar"/>
相关文章推荐
- android音乐播放器
- 安卓拼图游戏(二)
- 菜鸟学Android源码——Setting(1)
- 安卓分辨率的相关知识
- AndroidAnnotations注解
- android下载apk且安装
- drwxrwxrwx 安卓权限代表意思
- GridLayout布局
- 分享:AndroidStudio翻译插件:ECTranslation
- Android中常用的优秀开源框架
- Android百度地图(四)如何引入离线地图包
- AndroidStudio给项目添加注解Butterknife8.7.0
- Android第三十七天
- android--checkbox(内部监听器)
- ANDROID 中常用的第三方框架
- android判断当前系统版本的等级
- week2 布局技巧与列表控件
- week1 Android应用界面开发
- Android项目开发之Sqlite数据存储
- Android性能优化之:绘制优化