您的位置:首页 > 运维架构 > 网站架构

安卓开发 第六篇 我的安卓应用架构设计-----BaseActivity类

2016-05-10 10:30 597 查看
BaseActivity是我的架构设计中所有activity的基类,含有一些公共的属性和方法,同时控制toolbar的显示,以及其他一些功能。。。

来看源码:

/**
* BaseActivity 是所有activity的基类,把一些公共的方法放到里面
* <p>
* Created by tianlai on 16-3-3.
*/
public abstract class BaseActivity extends AppCompatActivity implements BaseUiView {

private ActivityComponent activityComponent;

@Inject
protected LayoutInflater inflater;

@Inject
protected Context context;

@Inject
protected AppPageManager appPageManager;

protected Toolbar toolbar;

protected LinearLayout rootView;

protected BasePresenter presenter;

protected LoadingDialog loadingDialog;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 使用依赖注入
initInjector();
injectActivity(activityComponent);

//设置根布局
rootView = (LinearLayout) inflateView(R.layout.activity_base);
setContentView(rootView);

// 将当前activity加入ActivityManager中
appPageManager.addActivity(this);

// 设置导航栏
toolbar = (Toolbar) find(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);

initToolbar(toolbar);

//初始化加载数据对话框
loadingDialog=new LoadingDialog(this);
loadingDialog.setCanceledOnTouchOutside(false);
loadingDialog.setCancelable(true);

loadingDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface loadingDialog) {
presenter.cancleLoading();
}
});

//初始化Presenter
presenter = getPresenter();
if (presenter == null) {
throw new NullPointerException("presenter 不能为 Null");
} else {
presenter.oncreate(savedInstanceState, context);
}

}

/**
* 初始化Toolbar
*
* @param toolbar
*/
protected void initToolbar(Toolbar toolbar) {

toolbar.setNavigationIcon(R.mipmap.ic_toolbar_navigation);

toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
}

/**
* 设置页面的标题
*
* @param title
*/
protected void setPageTitle(String title) {
setPageTitle(FontUtil.addColor("#F04877", title));
}

/**
* @param title
*/
protected void setPageTitle(CharSequence title) {
toolbar.setTitle(title);
}

/**
* @param resId
*/
protected void setNavigationIcon(int resId) {
toolbar.setNavigationIcon(resId);
}

/**
* // 加载ContentView的内容
*
* @param view
*/
protected void setContentViewToRoot(View view) {

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout
.LayoutParams.MATCH_PARENT);
rootView.addView(view, params);
}

protected void setContentViewToRoot(int layoutId) {
setContentViewToRoot(inflateView(layoutId));
}

/**
* 进行注入
*
* @param activityComponent
*/
protected abstract void injectActivity(ActivityComponent activityComponent);

/**
* 获取 ActivityModule
*
* @return
*/
protected ActivityModule getActivityModule() {
return new ActivityModule(this);
}

/**
* 获取注入Activity的Presenter对象
*
* @return
*/
protected abstract BasePresenter getPresenter();

/**
* 隐藏Toolbar
*/
protected void hideToolbar() {

toolbar.setVisibility(View.GONE);
}

/**
* 把布局变成View
*
* @param layoutId
* @return
*/
protected View inflateView(int layoutId) {
return inflater.inflate(layoutId, null);
}

/**
* 设置注入器
*/
private void initInjector() {
ApplicationComponent appComponent = getAppComponent();
appComponent.inject(this);

activityComponent = DaggerActivityComponent.builder()
.applicationComponent(appComponent)
.activityModule(new ActivityModule(this))
.build();
}

/**
* 获取 ApplicationComponent
*
* @return
*/
public ApplicationComponent getAppComponent() {
return ((AppApplication) getApplication()).getAppComponent();
}

/**
* activityComponent的getter方法
*
* @return
*/
public ActivityComponent getActivityComponent() {

return activityComponent;
}

/**
* 显示页面加载状态
*/
@Override
public void showLoading() {
if (loadingDialog != null && !loadingDialog.isShowing()) {
loadingDialog.show();
}
}

/**
* 加载完成,隐藏加载状态
*/
@Override
public void loadingComplete() {

if (loadingDialog != null && loadingDialog.isShowing()) {
loadingDialog.dismiss();
}
}

@Override
protected void onResume() {
super.onResume();

presenter.onResume(this);
Bugtags.onResume(this);
}

@Override
protected void onPause() {
super.onPause();

presenter.onPause();
Bugtags.onPause(this);
}

@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);

presenter.onSave(outState);
}

@Override
protected void onDestroy() {
super.onDestroy();

appPageManager.removeActivity(this);

presenter.onDestroy();

presenter = null;

ToastUtil.cancleToast();

}

/**
* 生成Toolbar右边Action按钮
*
* @param name
* @param viewId
* @return
*/
@SuppressLint("NewApi")
public TextView addRightActionView(CharSequence name, int viewId) {
TextView tv_right = new TextView(context);

if (viewId == 0) {
tv_right.setId(R.id.tv_right_action);
} else {
tv_right.setId(viewId);
}

tv_right.setTextColor(getResources().getColor(R.color.font_red));
tv_right.setText(name);
tv_right.setCompoundDrawablePadding(DpUtil.dp2px(context, 3));
tv_right.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
tv_right.setGravity(Gravity.CENTER);

Toolbar.LayoutParams layoutParams = new Toolbar.LayoutParams(Toolbar.LayoutParams.WRAP_CONTENT,
Toolbar.LayoutParams.WRAP_CONTENT);
layoutParams.rightMargin = DpUtil.dp2px(context, 10);
layoutParams.gravity = Gravity.CENTER_VERTICAL | Gravity.RIGHT;
tv_right.setLayoutParams(layoutParams);

return tv_right;

}

/**
* 生成Toolbar中心显示titile的View
*
* @return
*/
@SuppressLint("NewApi")
public TextView addCenterTitleView(String title, int viewId) {
TextView tv_title = new TextView(context);

if (viewId == 0) {
tv_title.setId(R.id.tv_center_title);
} else {
tv_title.setId(viewId);
}

tv_title.setTextColor(getResources().getColor(R.color.font_red));
tv_title.setCompoundDrawablePadding(DpUtil.dp2px(context, 3));
tv_title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
tv_title.setGravity(Gravity.CENTER);

Toolbar.LayoutParams layoutParams = new Toolbar.LayoutParams(Toolbar.LayoutParams.WRAP_CONTENT,
Toolbar.LayoutParams.WRAP_CONTENT);
layoutParams.gravity = Gravity.CENTER;
tv_title.setLayoutParams(layoutParams);

if (title != null) {
tv_title.setText(title);
}

return tv_title;
}

/**
* 设置应用的字体不随系统设置的更改而更改
*/
@Override
public Resources getResources() {
Resources resources = super.getResources();
Configuration config = new Configuration();
config.setToDefaults();
resources.updateConfiguration(config, resources.getDisplayMetrics());
return resources;
}

public AppPageManager getAppPageManager() {
return appPageManager;
}

public void setAppPageManager(AppPageManager appPageManager) {
this.appPageManager = appPageManager;
}

/**
* 获取view
*
* @param viewId
* @return
*/
public View find(int viewId) {
return findViewById(viewId);
}

/**
* 获取view
*
* @param viewId
* @return
*/
public View find(View parent, int viewId) {
return parent.findViewById(viewId);
}

/**
* 隐藏软键盘
*/
protected void hideIME() {
((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(
this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}

}


BaseActivity中的有些方法是由于项目的需要而添加的,可能在其他项目中不需要,这点请大家自行忽略。

其中BaseUiView 是所有对view操作接口的基类:

/**
* BaseUiView 是应用中所有UiView的顶级抽象类,适合抽取UiView的公共方法和属性
*
* UiView:MVP架构中的V。
*
* Created by tianlai on 16-3-3.
*/
public interface BaseUiView {

/**
* showLoading 方法主要用于页面请求数据时显示加载状态
*/
public void showLoading();

/**
* showEmpty 方法用于请求的数据为空的状态
*/
public void showEmpty();

/**
* showError 方法用于请求数据出错
*/
public void showError();

/**
* showError 方法用于请求数据完成
*/
public void loadingComplete();

}


下面来看一个具体的activity:

/**
* LoginActivity app的登录页面
* <p>
* Created by tianlai on 16-3-3.
*/
public class LoginActivity extends BaseActivity implements LoginView {

@Inject
LoginPresenter loginPresenter;

@Bind(R.id.edt_account)
EditText edtAccount;

@Bind(R.id.edt_psw)
EditText edtPsw;

@Bind(R.id.tv_login)
TextView tvLogin;

@Bind(R.id.tv_register)
TextView tvRegister;

@Bind(R.id.tv_forgetpsw)
TextView tvForgetpsw;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

View contentView = inflateView(R.layout.activity_login);

setContentViewToRoot(contentView);

ButterKnife.bind(this, contentView);

hideToolbar();

}

@OnClick({R.id.tv_login,R.id.tv_register,R.id.tv_forgetpsw})
public void OnClick(View v){
switch (v.getId()){
case R.id.tv_login:
//进行登录请求
loginPresenter.login(getPhoneNum(),getPasswd());
break;
case R.id.tv_register:
toRegisterPage();
break;

case R.id.tv_forgetpsw:
toResetPasswdPage();
break;
}
}

@Override
protected void injectActivity(ActivityComponent activityComponent) {
activityComponent.inject(this);
}

@Override
protected BasePresenter getPresenter() {
return loginPresenter;
}

@Override
public void showEmpty() {

}

@Override
public void showError() {

}

@Override
public void toRegisterPage() {
startActivity(new Intent(this,RegisterActivity.class));
}

@Override
public String getPhoneNum() {
return edtAccount.getText().toString().trim();
}

@Override
public String getPasswd() {
return edtPsw.getText().toString().trim();
}

@Override
public void toMainPage() {
startActivity(new Intent(this,MainActivity.class));

finish();
}

@Override
public void toResetPasswdPage() {
startActivity(new Intent(this,ResetPswActivity.class));
}
}


而LoginView :

/**
*
* Created by tianlai on 16-3-3.
*/
public interface LoginView extends BaseUiView {
/**
* 去到注册页面
*/
public void toRegisterPage();

/**
* 获取登录手机号
*
* @return
*/
public String getPhoneNum();

/**
* 获取登录密码
*
* @return
*/
public String getPasswd();

/**
* 去主页面
*/
public void toMainPage();

/**
* 去重置密码页面
*/
public void toResetPasswdPage();
}


页面布局(activity_login.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/bg_login"
android:gravity="center"
android:orientation="vertical">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="用户登录"
android:textColor="@color/white"
android:textSize="25sp"
android:textStyle="bold" />

<EditText
android:id="@+id/edt_account"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginLeft="40dp"
android:layout_marginRight="40dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:maxLength="20"
android:singleLine="true"
android:textColor="@color/font_black_light"
android:textColorHint="@color/hint_color"
android:hint="@string/hint_account"
android:layout_marginTop="60dp"
android:background="@color/white" />

<EditText
android:id="@+id/edt_psw"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginLeft="40dp"
android:layout_marginRight="40dp"
android:paddingLeft="8dp"
android:singleLine="true"
android:paddingRight="8dp"
android:maxLength="16"
android:textColor="@color/font_black_light"
android:textColorHint="@color/hint_color"
android:hint="@string/hint_psw"
android:layout_marginTop="20dp"
android:background="@color/white" />

<TextView
android:id="@+id/tv_login"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginLeft="40dp"
android:layout_marginRight="40dp"
android:layout_marginTop="40dp"
android:background="@drawable/bg_btn_round_green_5"
android:gravity="center"
android:text="@string/login_now"
android:textColor="@color/whitesmoke"
android:textSize="18sp" />

<TextView
android:id="@+id/tv_register"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginLeft="40dp"
android:layout_marginRight="40dp"
android:layout_marginTop="20dp"
android:background="@drawable/bg_btn_round_green_5"
android:gravity="center"
android:text="@string/register_now"
android:textColor="@color/whitesmoke"
android:textSize="18sp" />

<TextView
android:id="@+id/tv_forgetpsw"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:gravity="center"
android:text="@string/forget_psw"
android:textColor="@color/aqua"
android:textSize="14sp" />

</LinearLayout>


最终效果:



额,发现没什么可以说的了,就到这里吧!

如果有更深的理解,本文将会修改;

如果有错误的地方,欢迎指正;

如果你有更好的理解,欢迎交流。

本文为原创文章,版权归博主所有,转载请注明出处。

更多资料:

我的github地址以及使用demo: https://github.com/naivor/naivorapp
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: