自定义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"/>