2023年7月13日发(作者:)
Android封装含有通⽤标题栏的基类BaseActivity安卓开发中,经常会遇到项⽬的标题栏基本样式都是⼀致的,只有个别界⾯需要定制化,⽽TitltBar或许跟我们的业务需求不是很相符,所以很多时候我们都想要去封装⼀个含有通⽤标题栏并且可定制化的BaseActivity。本⽂希望对有这⽅⾯需求的童鞋提供⼀种参考。效果图类似于这样⾸先很多开发者⽐较喜欢的⼀种做法是写⼀份通⽤的标题栏布局,然后在每次创建的Activity的布局⽂件中去选择include的⽅式加⼊布局,这种⽅式其实在我看来⼯作量其实还是挺⼤,为了使⽤的时候更⽅便,可以将写好的标题栏布局作为⼀个View添加到根布局中。下⾯先贴出标题栏的布局:
@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的activity中同样也可以调⽤addTitleBarLayout⽅法来加载另外的标题栏布局,但是此时由于在上⼀级基类Activity中已经对标题栏进⾏了操作,所以请务必保持加载的新标题栏布局的每个控件id和通⽤标题栏的控件id⼀致,否则会造成空指针异常,当然如果只是对标题栏的颜⾊或者字体颜⾊那些修改的话,也提供两种思路,⼀种是定义另外⼀个主题颜⾊的标题栏布局,但是id与通⽤标题栏每个控件id⼀致;第⼆种是在上⼀级基类Activity中开放另外⼀个⽅法,调⽤时动态更新主题颜⾊等。如果有问题欢迎指出,⾮常感谢!
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1689212502a221788.html
评论列表(0条)