一、需求分析
项目中的activity存在大量相同的方法和变量生命,且在activity的初始化方法中,也有部分代码相同,为方便管理和使用activity,因此自定义一个适用自己的BaseActivity,在这里,BaseActivity不包含任何页面内容。
二、代码实现
第一部分:BaseActivity
新建一个class名为“BaseActivity”,内容如下。代码中已有注释,这里不在说明。
public abstract class BaseActivity extends AppCompatActivity {
protected B view;
private LoadDialog loadDialog;
protected Activity activity;
protected Handler handler;
@Override
protected void onCreate ( @Nullable Bundle savedInstanceState ) {
super.onCreate ( savedInstanceState );
activity = this;
handler = new Handler ( Looper.getMainLooper ( ) );
loadDialog = new LoadDialog ( activity );
view = setView ( );
if ( view != null ) {
setContentView ( view.getRoot ( ) );
}
onCreate ( );
}
/**
* 设置内容
*
* @return v
*/
public abstract B setView ( );
/**
* 初始化
*/
public abstract void onCreate ( );
/**
* 显示加载框
*
* @param message 内容
*/
public void showLoad ( String message ) {
loadDialog.showloading ( message );
}
/**
* 关闭加载框
*/
public void closeLoad ( ) {
loadDialog.dismiss ( );
}
/**
* 吐司
*
* @param s 吐司内容
*/
public void toast ( String s ) {
Toast.makeText ( activity, s, Toast.LENGTH_SHORT ).show ( );
}
/**
* 打开activity
*
* @param mClass mClass
*/
public void openActivity ( Class mClass ) {
startActivity ( new Intent ( activity, mClass ) );
}
/**
* 打开activity
*
* @param mClass mclass
* @param code code
*/
public void openActivity ( Class mClass, int code ) {
startActivityForResult ( new Intent ( activity, mClass ), code );
}
/**
* 打开activity
*
* @param intent intent
*/
public void openActivity ( Intent intent ) {
startActivity ( intent );
}
/**
* 打开activity
*
* @param intent intent
* @param code code
*/
public void openActivity ( Intent intent, int code ) {
startActivityForResult ( intent, code );
}
@Override
protected void onDestroy ( ) {
super.onDestroy ( );
handler.removeCallbacksAndMessages ( null );
}
}
至此,BaseActivity已经建立完毕,接下来就是使用它。新建MainActivity(包括xml布局文件)。使用方法非常简单。
public class MainActivity extends BaseActivity {
@Override
public ActivityMainBinding setView ( ) {
return ActivityMainBinding.inflate ( getLayoutInflater ( ) );
}
@Override
public void onCreate ( ) {
view.tvTitle.setText("你好,Android!");
}
}
MainActivity对应的xml布局文件如下
第二部分:BaseFragment
新建一个class名为BaseFragment,内容如下
public abstract class BaseFragment extends Fragment {
protected LayoutInflater inflater;
protected ViewGroup container;
protected B view;
private LoadDialog loadDialog;
protected final Activity activity;
public BaseFragment ( Activity activity ) {
this.activity = activity;
}
@Nullable
@Override
public View onCreateView ( @NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState ) {
this.inflater = inflater;
this.container = container;
view = setView ( );
loadDialog = new LoadDialog ( activity );
onCreate ( );
return view.getRoot ( );
}
//忽略跟BaseActivity一样的内容
}
使用方法,新建一个IndexFragment 继承BaseFragment。
public class IndexFragment extends BaseFragment {
public IndexFragment ( Activity activity ) {
super ( activity );
}
@Override
public FragmentIndexBinding setView ( ) {
return FragmentIndexBinding.inflate ( inflater, container, true );
}
@Override
public void onCreate ( ) {
}
}
三、注意事项
1、以上代码实现,请使用viewBinding。
android {
······
buildFeatures {
viewBinding = true
}
}
2、base可以预先定义一个容器,如统一的标题,返回键等。获取到子页面的viewbinding后,用view.addView();方法即可。如遇到layoutParams为空的情况,请在base中做处理。
3、BaseFragment为避免activity为空,这里直接使用mainActivity。
四、总结
1、通过以上方式建立的BaseActivity和BaseFragment,相对而言,代码量少很多。而且base中声明的方法很明确不容易出错。不像别的方法如init(),main();doWork();doStart();容易混淆,稍有不慎可能还会导致空指针。
2、ViewBinding为android程序猿节省了不少时间,新项目或在条件允许下,建议更换成它。