Android 高效开发之-Activity的简化写法
2020-08-20 本文已影响0人
可乐_JS
-
简单介绍下近期项目使用到的Activity简化开发的实践方案
-
之前你可能是每个页面即Activity都是一个完整的XML文件,一个完整的Activity(大多数人都会抽出来一个BaseActivity)
-
下面我要说的是,我们可以把更多的可公用的部分全部抽离出来到BaseActivity,后面的话每个XML,Activity只需要实现红色的部分的XML和Activity逻辑即可,红色部分如下图:

-
具体实现相信很多人都能想到,也可能早已经开始这样做了,或许有些人还没尝试过,那么,接下来我们就看看具体的实现流程吧!
1.activity_base.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<!--显示区域-->
<LinearLayout
android:id="@+id/act_root_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:orientation="vertical">
<!--标题-->
<include layout="@layout/title_bar" />
<!--内容区域-->
<FrameLayout
android:id="@+id/act_content_fl"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/color_FFFFFF" />
</LinearLayout>
<!--无网络视图-->
<ViewStub
android:id="@+id/no_net_work_vs"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:inflatedId="@+id/no_net_work_vs_inflated_id"
android:layout="@layout/layout_no_net_work" />
</FrameLayout>
- title_bar.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/titleBar_base_root_ll"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_50"
android:orientation="vertical">
<!--标题栏-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="@dimen/dp_0"
android:layout_weight="1"
android:orientation="horizontal">
<!--返回-->
<LinearLayout
android:id="@+id/titleBar_base_back_ll"
android:layout_width="@dimen/dp_0"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_vertical">
<ImageView
android:id="@+id/titleBar_base_back_iv"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:paddingHorizontal="@dimen/dp_16"
android:src="@drawable/ic_title_bar_back" />
</LinearLayout>
<!--中间标题-->
<LinearLayout
android:layout_width="@dimen/dp_0"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center">
<TextView
android:id="@+id/titleBar_base_title_tv"
android:layout_width="@dimen/dp_0"
android:layout_height="match_parent"
android:layout_weight="1"
android:ellipsize="end"
android:gravity="center"
android:singleLine="true"
android:textColor="@color/color_000000_85"
android:textSize="@dimen/sp_18"
tools:text="我是标题" />
</LinearLayout>
<!--右侧部分-->
<LinearLayout
android:id="@+id/titleBar_base_right_ll"
android:layout_width="@dimen/dp_0"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="right|center_vertical"
android:paddingHorizontal="@dimen/dp_15">
<TextView
android:id="@+id/titleBar_base_right_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="我是右侧文字" />
<ImageView
android:id="@+id/titleBar_base_right_iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="@dimen/dp_0_5"
android:layout_gravity="bottom"
android:background="@color/color_EEEEEE" />
</LinearLayout>
2.BaseActivity.java
/**
* @Description:
* @Author: kele
* @email: 984127585@qq.com
* @Date: 2020/6/19 0019
*/
public abstract class BaseActivity<T extends IBaseP> extends AppCompatActivity implements View.OnClickListener {
protected T mPresenter;
/**
* 返回图标
*/
private ImageView ivBack;
/**
* 标题
*/
private TextView tvTitle;
/**
* 左侧文字
*/
private TextView tvRight;
/**
* 返回布局
*/
private View llBack;
/**
* 右侧布局
*/
private View llRight;
/**
* 中间主体布局
*/
private View contentView;
private View llTitleBarBaseRoot;
private View llRootView;
/**
* 右边图标
*/
private ImageView ivRight;
/**
* 内容布局
*/
private FrameLayout flContent;
/**
* 无网络布局
*/
private ViewStub vsNoNetWork;
private View noNetWork;
protected boolean isNeedCheckNetWork = true;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
BarUtil.getInstance().setTranslucentStatus(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_base);
initBaseView();
initBaseData();
initBaseListener();
mPresenter = createPresenter();
initViews();
initData();
}
@Override
protected void onResume() {
super.onResume();
if (isNeedCheckNetWork) {
checkNetWork();
}
}
/**
* 效验网络连接状态
*/
private boolean checkNetWork() {
if (null != noNetWork) {
noNetWork.setVisibility(View.GONE);
}
boolean isNetConnected = NetworkUtils.isConnected();
if (!isNetConnected) {
if (null != noNetWork) {
noNetWork.setVisibility(View.VISIBLE);
} else {
initNoNetWorkViews();
}
}
return isNetConnected;
}
/**
* 初始化监听
*/
private void initBaseListener() {
if (null != ivBack) {
ivBack.setOnClickListener(this);
}
if (null != tvRight) {
tvRight.setOnClickListener(this);
}
}
/**
* 初始化数据
*/
private void initBaseData() {
if (null != ivBack) {
ivBack.setImageDrawable(getDrawable(R.drawable.ic_title_bar_back));
}
}
/**
* 初始化视图
*/
private void initBaseView() {
llRootView = findViewById(R.id.act_root_view);
llTitleBarBaseRoot = findViewById(R.id.titleBar_base_root_ll);
ivBack = findViewById(R.id.titleBar_base_back_iv);
tvTitle = findViewById(R.id.titleBar_base_title_tv);
tvRight = findViewById(R.id.titleBar_base_right_tv);
ivRight = findViewById(R.id.titleBar_base_right_iv);
llBack = findViewById(R.id.titleBar_base_back_ll);
llRight = findViewById(R.id.titleBar_base_right_ll);
flContent = findViewById(R.id.act_content_fl);
createContentView();
//添加主体布局
flContent.removeAllViews();
flContent.addView(contentView);
//无网络布局
vsNoNetWork = findViewById(R.id.no_net_work_vs);
}
/**
* 初始化无网络布局
*/
private void initNoNetWorkViews() {
if (null == vsNoNetWork) {
return;
}
noNetWork = vsNoNetWork.inflate();
View tvTryAgainBtn = noNetWork.findViewById(R.id.try_again_btn_tv);
if (null == tvTryAgainBtn) {
return;
}
tvTryAgainBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (checkNetWork()) {
initData();
}
}
});
}
/**
* 创建主体布局
*/
private void createContentView() {
contentView = LayoutInflater.from(this).inflate(getContentViewID(), null);
}
/**
* 设置背景颜色
*
* @param colorId
*/
public void setRootViewBgColor(int colorId) {
if (null == llRootView) {
return;
}
llRootView.setBackgroundColor(colorId);
}
public void setContentViewBgColor(int colorId) {
if (null == flContent) {
return;
}
flContent.setBackgroundColor(colorId);
}
/**
* 设置背景图片
*
* @param imgId
*/
public void setRootViewBgImg(int imgId) {
if (null == llRootView) {
return;
}
llRootView.setBackgroundResource(imgId);
}
public void setIvBackVisible(boolean visible) {
if (null == ivBack) {
return;
}
ivBack.setVisibility(visible ? View.VISIBLE : View.GONE);
}
/**
* 设置标题栏可见状态
*
* @param visible
*/
public void setTitleBarVisible(boolean visible) {
if (null == llTitleBarBaseRoot) {
return;
}
llTitleBarBaseRoot.setVisibility(visible ? View.VISIBLE : View.GONE);
}
public void setTitleBarBg(int drawableBg) {
if (null == llTitleBarBaseRoot) {
return;
}
llTitleBarBaseRoot.setBackground(getDrawable(drawableBg));
}
/**
* 设置标题
*
* @param title
*/
protected void setTvTitle(String title) {
if (null != tvTitle) {
tvTitle.setText(title);
}
}
public void setTvTitleColor(int colorId) {
if (null == tvTitle) {
return;
}
tvTitle.setTextColor(AppCompatResources.getColorStateList(this, colorId));
}
public void setTvTitleSize(int size) {
if (null == tvTitle) {
return;
}
tvTitle.setTextSize(size);
}
public void setIvRightBg(int drawableBg) {
if (null == ivRight) {
return;
}
ivRight.setBackground(getDrawable(drawableBg));
}
public void setIvRightVisible(boolean visible) {
if (null == ivRight) {
return;
}
ivRight.setVisibility(visible ? View.VISIBLE : View.GONE);
}
public void setIvRightClickListener(View.OnClickListener listener) {
if (null == ivRight) {
return;
}
ivRight.setOnClickListener(listener);
}
public void setLlBackListener(View.OnClickListener listener) {
if (null == llBack) {
return;
}
llBack.setOnClickListener(listener);
}
@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.titleBar_base_back_iv) {
onBackPressed();
} else if (id == R.id.titleBar_base_right_tv) {
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (null != mPresenter) {
mPresenter.onVDestroy();
}
}
/**
* 显示加载弹层
*/
protected void showLoading() {
}
/**
* 隐藏加载弹层
*/
protected void hideLoading() {
}
/**
* 初始化Presenter
*
* @return
*/
protected abstract T createPresenter();
/**
* 初始化布局
*
* @return
*/
protected abstract int getContentViewID();
/**
* 初始化view
*/
protected abstract void initViews();
/**
* 初始化数据
*/
protected abstract void initData();
}
- 上面代码中有些注释没加,不过也不难,相信大家都能理解
3.activity_login.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:orientation="vertical"
android:paddingHorizontal="@dimen/dp_15">
//画自己的布局-也就是上面效果图中的红色区域的布局
……
</LinearLayout>
4.LoginActivity.java
/**
* Des: 登录界面
* Created by kele on 2020/7/17.
* E-mail:984127585@qq.com
*/
public class LoginActivity extends BaseActivity<LoginP> implements LoginControl.V {
public static void launch(Activity act) {
if (null == act) {
return;
}
Intent intent = new Intent(act, LoginActivity.class);
act.startActivity(intent);
}
@Override
protected LoginP createPresenter() {
return new LoginP(this);
}
@Override
protected int getContentViewID() {
return R.layout.activity_login;
}
@Override
protected void initViews() {
}
@Override
protected void initData() {
}
}
- 在后面的Activity中只需要专注内容区域的逻辑即可,当然也可以控制Title区域的
- 上面使用到的MVP的写法可以参考之前的文章:Android MVP简介