自定义Android titleBar

简介: 自定义Android titleBar

640.jpg

Android titleBar可以直接集成到每一个页面不需include布局文件,在BaseActivity集成。 不需要重新设置title,也不需要include。 加载页面的速度也提高很多;

一,自定义导航栏

1,通过TitleBuilder类构建自定义的的导航栏,左边显示返回键,中间的标题栏及副标题,右边显示菜单栏;

 * title栏根布局
 */
protected View mTitleView;// titleView
protected  RelativeLayout mTitleBgColor;
protected RelativeLayout mTitleLeftRelativeLayout;//title左边布局
protected RelativeLayout mTitleMiddleRelativeLayout;//title中间布局
protected RelativeLayout mTitleRightRelativeLayout;//title右边布局
protected ImageView mTitleLeftImageView;//title左边icon显示
protected Button mTitleLeftButton;//title左边文本显示
protected TextView mTitleMiddleTextView;//title中间文本显示
protected TextView mSubTitleTextView;//副标题文本显示
protected TextView mTitleRightTextView;//title右边文本显示
protected ImageView mTitleRightImageView;//title右边图片显示
protected ImageView mTitleRightTips;//title右边小红点提示

2,通过代码创建动态布局,省去了加载xml文件,则提高代码运行效率;

/**
     *设置一个布局容器,装载title_layout和传进来的layoutId 返回一个View视图
     * @param layoutId
     * @return
     */
    protected  View initBar(int layoutId){
        relativeLayout = new RelativeLayout(activity);
        mScrollView = new ScrollView(activity);
        RelativeLayout.LayoutParams rootLl = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
        relativeLayout.setLayoutParams(rootLl);
        mTitleView = activity.getLayoutInflater().inflate(R.layout.title_layout_activity,null);
        mTitleBgColor = (RelativeLayout) mTitleView.findViewById(R.id.title_bar_id);
        mTitleLeftRelativeLayout = (RelativeLayout) mTitleView.findViewById(R.id.left_relative_layout);
        mTitleMiddleRelativeLayout = (RelativeLayout) mTitleView.findViewById(R.id.mid_relative_layout);
        mTitleRightRelativeLayout = (RelativeLayout) mTitleView.findViewById(R.id.right_relative_layout);
        mTitleLeftImageView = (ImageView) mTitleView.findViewById(R.id.left_icon_title);
        mTitleLeftButton = (Button) mTitleView.findViewById(R.id.left_btn);
        mTitleMiddleTextView = (TextView) mTitleView.findViewById(R.id.middle_text);
        mSubTitleTextView = (TextView) mTitleView.findViewById(R.id.middle_sub_text);
        mTitleRightTextView = (TextView) mTitleView.findViewById(R.id.title_right_text);
        mTitleRightImageView = (ImageView) mTitleView.findViewById(R.id.title_right_image_view);
        mTitleRightTips = (ImageView) mTitleView.findViewById(R.id.right_new_info);
        mRootView = LayoutInflater.from(activity).inflate(layoutId,null);//activity布局文件
        RelativeLayout.LayoutParams rl = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
        rl.addRule(RelativeLayout.BELOW, R.id.title_bar_id);
        relativeLayout.addView(mTitleView);
        relativeLayout.setClipToPadding(false);
        relativeLayout.setFitsSystemWindows(true);
        relativeLayout.addView(mRootView);
        mRootView.setLayoutParams(rootLl);
//        RelativeLayout.LayoutParams rl = (RelativeLayout.LayoutParams) mRootView.getLayoutParams();//面板没有全屏
        Log.e("qxf","mRootView.getWidth():"+mRootView.getWidth()+"mRootView.getHeight():"+mRootView.getHeight()+"mRootView.getMeasuredWidth():"+mRootView.getMeasuredWidth());
        mTitleLeftButton.setOnClickListener(this);
        mTitleLeftRelativeLayout.setOnClickListener(this);
        mTitleRightRelativeLayout.setOnClickListener(this);
        mTitleMiddleRelativeLayout.setOnClickListener(this);
        return  relativeLayout;
    }

3,注册监听事件

  /**
     * 设置监听事件
     * @param mTitleBuilderListener
     */
    public void setTitleBuilderListener(TitleBuilderListener mTitleBuilderListener){
        this.mListener = mTitleBuilderListener;
    }
    @Override
    public void onClick(View view) {
        if (mListener == null) {
            return;
        }
        if (view == mTitleLeftImageView|| view == mTitleLeftButton ||  view == mTitleLeftRelativeLayout){
            mListener.onButtonClicked(TitleButton.LEFT);
        }else if (view == mTitleMiddleTextView || view == mTitleMiddleRelativeLayout){
            mListener.onButtonClicked(TitleButton.MIDDLE);
        }
        else if(view == mTitleRightRelativeLayout || view == mTitleRightImageView || view == mTitleRightTextView){
            mListener.onButtonClicked(TitleButton.RIGHT);
        }
    }
    public interface TitleBuilderListener {
        void onButtonClicked(TitleButton clicked);
    }
}

二,在BaseActivty中集成

1、baseActivity是基类,集成过导航栏,其他activity不需要再次编写导航栏了,也不用include xml布局文件,可以统一的处理导航栏,来试试吧;

public abstract class  BaseActivity extends Activity  implements TitleBuilder.TitleBuilderListener {
    public TitleBuilder mTitleBuilder;
    private int TitleBarVisible;
    private boolean isChanageStatus = true;
    private boolean isFullScreen = false;
    private boolean isFirst = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // setContentView(R.layout.activity_main);
    }
    @Override
    public void setContentView(int id) {
        this.TitleBarVisible = View.VISIBLE;
        mTitleBuilder = new TitleBuilder(this);
        this.setToolBarVisible(this.TitleBarVisible);
        super.setContentView(mTitleBuilder.initBar(id));
        this.initToolBar(mTitleBuilder);
        this.setFullScreen(isFullScreen);
        mTitleBuilder.setTitleBuilderListener(this);
        setStatusBar(this.getTitleColor(),isChanageStatus);
    }
    @Override
    public void onButtonClicked(TitleBuilder.TitleButton clicked) {
        switch (clicked) {
            case LEFT:
                finish();
                Toast.makeText(this, "this is back", Toast.LENGTH_SHORT).show();
                break;
        }
    }
    public abstract void initToolBar(TitleBuilder mTitleBuilder);
    /**
     * 设置title是否可见  默认是可见状态
     *
     * @param visible
     */
    public void setToolBarVisible(int visible) {
        if (this.mTitleBuilder.mTitleView != null) {
            if (this.TitleBarVisible == visible)
                return;
            this.mTitleBuilder.mTitleView.setVisibility(visible);
        }
        this.TitleBarVisible = visible;
    }
    /**
     * 设置状态的属性
     *
     * @param statusBar
     */
    public void setStatusBar(int statusColor,boolean statusBar) {
        this.isChanageStatus = statusBar;
        if (statusBar) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                Window win = getWindow();
                WindowManager.LayoutParams winParams = win.getAttributes();
                final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
                winParams.flags |= bits;
                win.setAttributes(winParams);
            }
            //透明状态栏
            SystemBarTintManager tintManager = new SystemBarTintManager(this);
            tintManager.setStatusBarTintEnabled(true);
            tintManager.setStatusBarTintColor(statusColor);
            //getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            tintManager.setNavigationBarTintEnabled(true);
            //透明导航栏
            // getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        }
    }
    public void setFullScreen(boolean isFullScreen) {
//        if (isFullScreen) {
//            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
//        }else{
//            //getWindow().setFlags(WindowManager.LayoutParams.F,WindowManager.LayoutParams.FLAG_FULLSCREEN);
//        }
        this.isFullScreen = isFullScreen;
        if (isFullScreen) {
            WindowManager.LayoutParams lp = getWindow().getAttributes();
            lp.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
            getWindow().setAttributes(lp);
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
            this.setToolBarVisible(View.GONE);
        } else {
            WindowManager.LayoutParams attr = getWindow().getAttributes();
            attr.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
            getWindow().setAttributes(attr);
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
            this.setToolBarVisible(View.VISIBLE);
        }
    }
    @Override
    protected void onResume() {
        this.setContentScreen();
        super.onResume();
    }
    private float getScreenHeight() {
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        return dm.heightPixels;
    }
    private void setContentScreen() {
        int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
        int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
        mTitleBuilder.mRootView.measure(widthSpec, heightSpec);
        mTitleBuilder.mTitleView.measure(widthSpec, heightSpec);
            mTitleBuilder.mRootView.getViewTreeObserver().addOnPreDrawListener(
                    new ViewTreeObserver.OnPreDrawListener() {
                        @Override
                        public boolean onPreDraw() {
                            float height;
                            if(isFullScreen){
                                height = mTitleBuilder.mRootView.getMeasuredHeight();
                            }else if (TitleBarVisible == View.GONE){
                                height = mTitleBuilder.mRootView.getMeasuredHeight() + getStatusBarHeight();
                            }else{
                                height = mTitleBuilder.mRootView.getMeasuredHeight() + mTitleBuilder.mTitleView.getMeasuredHeight() + getStatusBarHeight();
                            }
                            Log.e("qxf", "height:" + height + "getScreenHeight():" + getScreenHeight() + "content" + mTitleBuilder.mRootView.getMeasuredHeight());
                            if (!isFirst) {
                                if (height+1 > getScreenHeight()) {
                                    isFirst = true;
                                    Log.e("qxf", "height:" + height + "getScreenHeight():" + getScreenHeight());
                                    ViewGroup viewParent = (ViewGroup) mTitleBuilder.mRootView.getParent();
                                    Log.e("qxf", viewParent + "111111111");
                                    if (viewParent != null)
                                        viewParent.removeView(mTitleBuilder.mRootView);
                                    ScrollView scrollView = new ScrollView(BaseActivity.this);
                                    RelativeLayout.LayoutParams rl = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
                                    rl.addRule(RelativeLayout.BELOW, R.id.title_bar_id);
                                    scrollView.setLayoutParams(rl);
                                    scrollView.setBackgroundColor(getResources().getColor(R.color.withe));
//                              viewParent.addView(mTitleBuilder.mTitleView);
                                    scrollView.addView(mTitleBuilder.mRootView);
                                    viewParent.addView(scrollView);
                                } else {
                                    Log.e("qxf", "getScreenHeight():" + getScreenHeight() + "mTitleBuilder.mRootView.getHeight()" + height);
                                }
                            }
                            return true;
                        }
                        });
    }
    private float getStatusBarHeight() {
        Class<?> c = null;
        Object obj = null;
        Field field = null;
        int x = 0, sbar = 0;
        try {
            c = Class.forName("com.android.internal.R$dimen");
            obj = c.newInstance();
            field = c.getField("status_bar_height");
            x = Integer.parseInt(field.get(obj).toString());
            sbar = getResources().getDimensionPixelSize(x);
        } catch (Exception e1) {
            Log.e("qxf", "get status bar height fail" + e1);
            e1.printStackTrace();
        }
       return  sbar;
    }

测试效果图:











相关文章
|
25天前
|
XML Java Android开发
Android实现自定义进度条(源码+解析)
Android实现自定义进度条(源码+解析)
52 1
|
4月前
|
XML Android开发 数据安全/隐私保护
Android 自定义开源库 EasyView
Android 自定义开源库 EasyView
|
4天前
|
移动开发 Java Unix
Android系统 自动加载自定义JAR文件
Android系统 自动加载自定义JAR文件
21 1
|
4天前
|
Shell Android开发 开发者
Android系统 自定义动态修改init.custom.rc
Android系统 自定义动态修改init.custom.rc
23 0
|
4天前
|
存储 安全 Android开发
Android系统 自定义系统和应用权限
Android系统 自定义系统和应用权限
19 0
|
29天前
|
Android开发
Android 开发 pickerview 自定义选择器
Android 开发 pickerview 自定义选择器
12 0
|
4月前
|
XML API Android开发
Android 自定义View 之 Dialog弹窗
Android 自定义View 之 Dialog弹窗
|
4月前
|
XML API Android开发
Android 自定义View 之 饼状进度条
Android 自定义View 之 饼状进度条
|
4月前
|
XML API Android开发
Android 自定义View 之 简易输入框
Android 自定义View 之 简易输入框
|
4月前
|
XML API Android开发
Android 自定义View 之 计时文字
Android 自定义View 之 计时文字