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;}@Overridepublic 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// setContentView(R.layout.activity_main);}@Overridepublic 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);}@Overridepublic 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);}}@Overrideprotected 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() {@Overridepublic 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;}}
测试效果图:
获取更多内容关注公众号:
qxf323
android开发
865618770