第一种方式:标题栏写成控件
第一步:定义标题栏用到的属性,在/values下新建attrs文件,添加属性,其中reference|color代表既可以用图片,也可以定义成一种颜色。
<declare-styleable name="TopTitle">
<attr name="title" format="string" />
<attr name="titleTextSize" format="dimension" />
<attr name="titleTextColor" format="color" />
<attr name="leftBackgroud" format="reference|color" />
<attr name="rightBackgroud" format="reference|color" />
<attr name="leftText" format="string" />
<attr name="rightText" format="string" />
</declare-styleable>
第二步,自定义TopTitle,继承RelativeLayout(ViewGroup),获取attrs中的属性
//获取typedarray里面的属性
private void initAttrs(AttributeSet attrs) {
TypedArray ta = ctx.obtainStyledAttributes(attrs, R.styleable.TopTitle);
title = ta.getString(R.styleable.TopTitle_title);
titleTextColor = ta.getColor(R.styleable.TopTitle_titleTextColor, 0);
titleTextSize = ta.getDimensionPixelSize(R.styleable.TopTitle_titleTextSize, 12);
leftText = ta.getString(R.styleable.TopTitle_leftText);
rightText = ta.getString(R.styleable.TopTitle_rightText);
leftBackgroud = ta.getDrawable(R.styleable.TopTitle_leftBackgroud);
rightBackgroud = ta.getDrawable(R.styleable.TopTitle_rightBackgroud);
}
第三步,创建需要用到的控件,标题栏,和两个按钮(可自行添加)
//分别为标题显示、左右两个button
tvTitle = new TextView(ctx);
leftBtn = new Button(ctx);
righttBtn = new Button(ctx);
//设置属性值
tvTitle.setText(title);
tvTitle.setTextColor(titleTextColor);
tvTitle.setTextSize(titleTextSize);
tvTitle.setGravity(Gravity.CENTER);
leftBtn.setText(leftText);
leftBtn.setBackgroundDrawable(leftBackgroud);
righttBtn.setText(rightText);
righttBtn.setBackgroundDrawable(rightBackgroud);
//控制显示位置
LayoutParams titleParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
titleParams.addRule(RelativeLayout.CENTER_IN_PARENT, TRUE);
addView(tvTitle, titleParams);
//控制显示位置
LayoutParams leftBtnParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
leftBtnParams.addRule(RelativeLayout.ALIGN_LEFT, TRUE);
addView(leftBtn, leftBtnParams);
//控制显示位置
LayoutParams rightBtnParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
rightBtnParams.addRule(RelativeLayout.ALIGN_RIGHT, TRUE);
addView(righttBtn, rightBtnParams);
//为两个按钮设置监听,通过接口方式对外提供
leftBtn.setTag(LEFT_BUTTON);
righttBtn.setTag(RIGHT_BUTTON);
leftBtn.setOnClickListener(this);
righttBtn.setOnClickListener(this);
第四步,对外暴露接口
public void setOnToptitleClickListener(ToptitleClickListener listener) {
this.mToptitleClickListener = listener;
}
@Override
public void onClick(View v) {
switch ((int) v.getTag()) {
case LEFT_BUTTON:
mToptitleClickListener.leftClick();
break;
case RIGHT_BUTTON:
mToptitleClickListener.rightClick();
break;
default:
break;
}
}
第五步:开始应用,在xml文件中
<!--需要声明作用域-->
xmlns:toptitle="http://schemas.android.com/apk/res-auto"
<!--使用-->
<com.example.sloven.myapplication.TopTitle
android:id="@+id/top_title"
android:layout_width="match_parent"
android:layout_height="16dp"
toptitle:title="我是小智"
toptitle:leftBackgroud="@mipmap/ic_launcher"
toptitle:rightBackgroud="@android:color/holo_red_dark"
toptitle:leftText="左边"
toptitle:rightText="右边"
toptitle:titleTextSize="30sp"
toptitle:titleTextColor="@android:color/holo_purple"
/>
第六步:在activity中跟普通控件一样使用
topTitle= (TopTitle) findViewById(R.id.top_title);
topTitle.setOnToptitleClickListener(new TopTitle.ToptitleClickListener() {
@Override
public void leftClick() {
Toast.makeText(MainActivity.this,"这是左边",Toast.LENGTH_SHORT).show();
}
@Override
public void rightClick() {
Toast.makeText(MainActivity.this,"这是右边",Toast.LENGTH_SHORT).show();
}
});
总结
此种方式较为繁琐复杂,只是一种思路,不推荐使用,更推荐下面几种方式。
第二种方式:自定义ViewGroup
此种方式较为简单,实现与第一种类似,但比第一种更为简单
1.写顶部xml布局
2.自定义viewgroup
public class TopTitleViewextends LinearLayout{
private LinearLayout mTopBack;
public TextView mTvBack;
public TextView mTvTitle;
public ImageView mIvRight;
public TextView mTvRight;
private Activity mActivity;
public TopTitleView(Context context) {
super(context);
}
public TopTitleView(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.top_bar_view, this, true);
mTopBack=(LinearLayout)this.findViewById(R.id.top_back_btn);
mTvBack=(TextView)this.findViewById(R.id.top_back_tv);
mTvTitle=(TextView)this.findViewById(R.id.top_title);
mTvRight=(TextView)this.findViewById(R.id.top_right_tv);
mIvRight=(ImageView)this.findViewById(R.id.top_right_btn);
mTopBack.setOnClickListener(onClickListener);
mTvRight.setOnClickListener(onClickListener);
mIvRight.setOnClickListener(onClickListener);
}
private OnClickListener onClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId()) {
case R.id.top_back_btn:
if(mActivity!=null)
mActivity.finish();
break;
case R.id.top_right_tv:
break;
case R.id.top_right_btn:
break;
}
}
};
public void setActivity(Activity activity) {
this.mActivity=activity;
}
public void setTitle(String title) {
mTvTitle.setText(title);
}
public void setRightText(String text) {
mTvRight.setText(text);
}
}
3.usage in xmls
<com.example.TopTitleView
android:id="@+id/topbar"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
4.usage in activities
mTopBar.setActivity(this);
mTopBar.setTitle("这是哪一页");
5.总结,个人比较喜欢这种方式,方便快捷,简单。
第三种方式:把标题栏写进BaseActivity
8-12
第四种方式:用android自带Actionbar、Toolbar
8-13