Android封装含有通用标题栏的基类BaseActivity

Android封装含有通用标题栏的基类BaseActivity

2023年7月13日发(作者:)

Android封装含有通⽤标题栏的基类BaseActivity安卓开发中,经常会遇到项⽬的标题栏基本样式都是⼀致的,只有个别界⾯需要定制化,⽽TitltBar或许跟我们的业务需求不是很相符,所以很多时候我们都想要去封装⼀个含有通⽤标题栏并且可定制化的BaseActivity。本⽂希望对有这⽅⾯需求的童鞋提供⼀种参考。效果图类似于这样⾸先很多开发者⽐较喜欢的⼀种做法是写⼀份通⽤的标题栏布局,然后在每次创建的Activity的布局⽂件中去选择include的⽅式加⼊布局,这种⽅式其实在我看来⼯作量其实还是挺⼤,为了使⽤的时候更⽅便,可以将写好的标题栏布局作为⼀个View添加到根布局中。下⾯先贴出标题栏的布局: 这⾥讲⼀下为什么返回按键,中间标题,右边两个⼩标题都选⽤了TextView,因为我的想法是为了让标题栏按钮是图标的时候,可以更快捷的使⽤。毕竟TextView还可以在它的上下左右动态添加Drawable嘛。还有⼀点,为什么选⽤线性布局中嵌套了⼀个相对布局,那是因为我考虑到以后可能会存在需要在标题栏下⾯添加⼀些类似于间隔啊之类的布局,所以就给预留出来了,如果不需要的话,可以选择去掉外层的线性布局。标题栏的右侧我⾃⼰是添加了两个预留的按钮,可以⽅便右上⾓存在⽐如保存、分享之类的操作。下⾯贴⼀下不含标题栏的基类BaseActivity的代码:/** * Activity基类 */public class BaseActivity extends FragmentActivity { protected int mResultCode = RESULT_CANCELED; private int mStatusHeight;// 状态栏⾼度 private int mTitleHeight;// 标题栏⾼度 private int mScreenWidth, mScreenHeight;// 屏幕宽度、⾼度 protected boolean mIsFirst = true;// true-界⾯第⼀次聚焦 private RequestUploadDialog mUploadDialog;// 加载框

@Override protected void onCreate(Bundle savedInstanceState) { te(savedInstanceState); tance().pushActivity(this);// activity⼊栈管理 }

@Override protected void onResume() { me(); }

@Override protected void onPause() { e(); }

@Override protected void onStart() { t(); }

@Override protected void onStop() { (); }

@Override protected void onDestroy() { roy(); tance().finishActivity(this);// activity出栈管理 } /** * 隐藏键盘 */ public void hideKeyBoard() { try { View rootView = dow().getDecorView(); View focusView = cus(); if (focusView != null) { int viewId = (); View view = findViewById(viewId); if (view instanceof EditText) { InputMethodManager manager = (InputMethodManager) getApplicationContext().getSystemService(_METHOD_SERVICE); ftInputFromWindow(dowToken(), 0); } } } catch (Exception e) { tackTrace(); } } /** * 获取状态栏⾼度 * @return 状态栏⾼度(px) */ public int statusHeight() { if (mStatusHeight == 0) { try { Class c = e("al.R$dimen"); int x = nt(ld("status_bar_height").get(tance()).toString()); mStatusHeight = getResources().getDimensionPixelSize(x); } catch (Exception e1) { tackTrace(); } } return mStatusHeight; } /** * 获取屏幕宽度 * @return 屏幕宽度(px) */ public int screenWidth() { if (mScreenWidth == 0) { DisplayMetrics displayMetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); mScreenWidth = ixels; } return mScreenWidth; } /** * 获取屏幕⾼度 * @return 屏幕⾼度(px) */ public int screenHeight() { if (mScreenHeight == 0) { DisplayMetrics displayMetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); mScreenHeight = Pixels; } return mScreenHeight; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == E_BACK) { return executeKeyDownBack(keyCode, event); } return own(keyCode, event); }

/** * 监听返回键 * @param keyCode 键值 * @param event 事件 * @return true-消耗事件,false-不消耗事件 */ protected boolean executeKeyDownBack(int keyCode, KeyEvent event) { return own(keyCode, event); }

/** * Home键监听回调⽅法 * @param context 上下⽂环境 * @param intent 意图 */ public void onHomeWatcherReceiver(Context context, Intent intent) {

} /** * 显⽰加载框 * @param uploadResId 资源ID */ public void showUpload(int uploadResId) { showUpload(getString(uploadResId)); } /** * 显⽰加载框 * @param uploadContent ⽂本 */ public void showUpload(String uploadContent) { if (mUploadDialog == null) mUploadDialog = new RequestUploadDialog(this); xt(uploadContent).show(); } /** * 隐藏加载框 */ public void hideUpload() { if (mUploadDialog == null) return; s(); }

/** * 显⽰提⽰语 * @param toastResId 资源ID */ public void showToast(int toastResId) { xt(this, toastResId, _SHORT).show(); }

/** * 显⽰提⽰语 * @param toastText ⽂本 */ public void showToast(String toastText) { xt(this, toastText, _SHORT).show(); } /** * 设置TextView的left图⽚(不添加⽂字) * @param textView 控件 * @param resIds 资源ID */ public void drawableLeft(TextView textView, int resIds) { ibility(E); t(""); Drawable drawable = getResources().getDrawable(resIds); nds(0, 0, rinsicWidth(), rinsicHeight()); poundDrawables(drawable, null, null, null); } /** * 设置TextView的right图⽚(不添加⽂字) * @param textView 控件 * @param resIds 资源ID */ public void drawableRight(TextView textView, int resIds) { ibility(E); t(""); Drawable drawable = getResources().getDrawable(resIds); nds(0, 0, rinsicWidth(), rinsicHeight()); poundDrawables(null, null, drawable, null); } /** * 设置TextView颜⾊ * @param textView 控件 * @param resId 资源ID */ public void textColor(TextView textView, int resId) { tColor(getResources().getColor(resId)); } /** * 着⾊状态栏(4.4以上系统有效) */ protected void SetStatusBarColor() { tusBarColor(this, or(this, _color)); } /** * 着⾊状态栏(4.4以上系统有效) */ protected void SetStatusBarColor(int color) { tusBarColor(this, color); } /** * 沉浸状态栏(4.4以上系统有效),全屏模式 */ protected void SetTranslanteBar() { ucentStatusBar(this); } @Override public void startActivity(Intent intent) { ctivity(intent); overridePendingTransition(_right2enter, _left2exit); } /** * 通过 Class 跳转界⾯,不含参数 **/ public void startActivity(Class cls) { startActivity(cls, null); } /** * 含有 Bundle 通过 Class 跳转界⾯ * 带有跳转动画 **/ public void startActivity(Class cls, Bundle bundle) { Intent intent = new Intent(); ss(this, cls); if (bundle != null) { ras(bundle); } startActivity(intent); overridePendingTransition(_right2enter, _left2exit); } /** * 通过 Class 跳转界⾯ **/ public void startActivityForResult(Class cls, int requestCode) { startActivityForResult(cls, null, requestCode); overridePendingTransition(_right2enter, _left2exit); } /** * 含有Bundle通过Class跳转界⾯ **/ public void startActivityForResult(Class cls, Bundle bundle, int requestCode) { Intent intent = new Intent(); ss(this, cls); if (bundle != null) { ras(bundle); } startActivityForResult(intent, requestCode); overridePendingTransition(_right2enter, _left2exit); } /** * 跳转到登录界⾯ */ public void jumpToLoginActivity(int requestCode) { Intent intent = new Intent(_LOGIN); startActivityForResult(intent, requestCode); overridePendingTransition(_bottom_in, _bottom_window); } @Override public void finish() { (); } /** * finish 当前界⾯,⼿动控制页⾯关闭动画 * * @param closeAnim true:关闭时有动画,false:关闭是⽆动画 */ public void finish(boolean closeAnim) { (); if (closeAnim) { overridePendingTransition(_left2enter, _right2exit); } }}⾥⾯封装了⼀些其他⽐较常⽤的⽅法,有⼏个细节的点可以描述⼀下1.⾥⾯封装了通⽤的弹toast和弹加载框的⽅法,当然加载框⼤家也可以封装到⽹络请求模块和本地数据库操作中去,这个看个⼈的喜好2.基类中包含有软键盘的关闭操作,因为安卓的软键盘⼀直是⼀个⽐较头疼的问题,所以我选择直接封装到基类中,如果需要⽤到某些操作需要关闭软键盘的可以直接调⽤3.封装的有对某个TextView添加Drawable的⽅法,这样标题栏需要加载图标的时候,⽅便调⽤4.封装的有修改状态栏颜⾊和主题的⽅法,但是StatusBarCompat这个⼯具类我没有贴出来,不知道其中操作细节的可以去⽹上⾃⾏搜索查看下⾯就是对含有标题栏的Activity的封装了,思路⽂章开头已经提到过,就直接上代码吧:/** * Activity基类:含TitleBar */public class BaseTitleBarActivity extends BaseViewStubActivity { protected TextView mTvCenter, mTvLeft, mTvRight, mTvMore; protected View mViewTitleBar; @Override protected void onCreate(Bundle savedInstanceState) { te(savedInstanceState); }

@Override public void setContentView(int layoutResID) { tentView(layoutResID); }

@Override protected void addTitleBarView() { mViewTitleBar = e(this, addTitleBarLayout(), null); mTvCenter = ewById(_titlebar_name); mTvLeft = ewById(_titlebar_left); mTvRight = ewById(_titlebar_right); mTvMore = ewById(_titlebar_more); lickListener(new OnClickListener() { @Override public void onClick(View v) { onTitleBarClickLeft(v); } }); lickListener(new OnClickListener() { @Override public void onClick(View v) { onTitleBarClickRight(v); } }); lickListener(new OnClickListener() { @Override public void onClick(View v) { onTitleBarClickCenter(v); } }); lickListener(new OnClickListener() { @Override public void onClick(View v) { onTitleBarClickMore(v); } }); onChangedTitleBar(mTvLeft, mTvCenter, mTvRight); w(mViewTitleBar); }

/** * 设置TitleBar布局 * @return TitleBar布局 * @return TitleBar布局 */ protected int addTitleBarLayout() { return _base_titlebar; } /** * 修改TitleBar * @param left 左边按钮 * @param center 中间⽂本 * @param right 右边按钮,默认隐藏 */ protected void onChangedTitleBar(TextView left, TextView center, TextView right) { ibility(); ibility(); } /** * TitleBar左边按钮点击事件 * @param view 控件 */ protected void onTitleBarClickLeft(View view) { setResult(mResultCode); finish(); }

/** * TitleBar右边按钮点击事件 * @param view 控件 */ protected void onTitleBarClickRight(View view) {

} /** * TitleBar右边(更多)按钮点击事件 * @param view 控件 */ protected void onTitleBarClickMore(View view) { }

/** * TitleBar中间按钮点击事件 * @param view 控件 */ protected void onTitleBarClickCenter(View view) {

} /** * 获取焦点 * @param view 控件 */ public void requestFocus(final View view) { layed(new Runnable() { @Override public void run() { usable(true); usableInTouchMode(true); tFocus(); } }, 100); }}BaseViewStubActivity的代码如下:/** * Activity基类:不含TitleBar */public class BaseViewStubActivity extends BaseActivity { protected LinearLayout mLayoutContent;

@Override protected void onCreate(Bundle savedInstanceState) { te(savedInstanceState); }

@Override public void setContentView(int layoutResID) { // 设置状态栏颜⾊// SetTranslanteBar(); tentView(ty_base_titlebar); mLayoutContent = findViewById(_content_view); addTitleBarView(); // 添加TitleBar addContentView(layoutResID);// 添加ContentView }

/** * 添加TitleBar */ protected void addTitleBarView() {

}

/** * 添加ContentView * @param layoutResID 布局 */ protected void addContentView(int layoutResID) { e(this, layoutResID, mLayoutContent); }}这⾥相关的activity_base_titlebar布局⽂件如下: 这样⼀来,使⽤的时候只需要继承⾃BaseTitlebarActivity并实现onChangedTitleBar就可以随意对标题栏进⾏定制化了,对左上⾓的按钮点击⽅法是默认的对出操作,如果需要重写,也可以⾃⼰重新对该⽅法进⾏实现,标题栏每个按钮的点击操作都是单独出来的,需要点击操作的时候再进⾏重写。效果图就不上了,谈⼀谈封装过程中遇到的⼀个最主要的问题吧最初在封装BaseViewStubActivity的时候addContentView⽅法中我是使⽤的w(e(this, layoutResID, null));这种⽅式进⾏添加,运⾏起来最初没有发现什么问题,但是⼀旦遇到相对布局的时候,需要在底部添加⼀个按钮的时候,发现最底部的控件的margin_bottom会失效,后来查阅了很多资料,原来是执⾏这句代码的时候,⼦布局其实并没有挂载到⽗布局中,所以造成了控件的布局宽⾼属性都为默认的_CONTENT⾃适应,不清楚的可以去阅读以下addView的源码,所以解决这个的⽅法有两种:第⼀种:修改添加⼦布局的⽅式为e(this, layoutResID, mLayoutContent);第⼆种:挂载的⽅式修改为w(e(this, layoutResID, null), Params(_PARENT, _PARENT));也就是⼿动赋予⼦布局⼀个布局参数。

补充:在继承⾃BaseTitlebarActivity的activity中同样也可以调⽤addTitleBarLayout⽅法来加载另外的标题栏布局,但是此时由于在上⼀级基类Activity中已经对标题栏进⾏了操作,所以请务必保持加载的新标题栏布局的每个控件id和通⽤标题栏的控件id⼀致,否则会造成空指针异常,当然如果只是对标题栏的颜⾊或者字体颜⾊那些修改的话,也提供两种思路,⼀种是定义另外⼀个主题颜⾊的标题栏布局,但是id与通⽤标题栏每个控件id⼀致;第⼆种是在上⼀级基类Activity中开放另外⼀个⽅法,调⽤时动态更新主题颜⾊等。如果有问题欢迎指出,⾮常感谢!

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1689212502a221788.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信