Android标题栏的几种解决思路

第一种方式:标题栏写成控件

第一步:定义标题栏用到的属性,在/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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值