您的位置:首页 > 移动开发 > Android开发

Android 自定义TopBar的复用

2016-07-19 22:02 495 查看
自定义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"/>       
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: