本人是第一次写csdn,写的不好请见谅
每个项目都有自己独自的框架和架构,包括Activity。一般项目都会自己写一个抽象的Activity。让所有Activity继承它。方便用于项目管理和统一性,还有可维护性。
首先在项目底下创建一个base包,”base” 代表标准、基准的意思。当然有很多这包下面很多种类。例如 Fragment、网络请求等
创建一个抽象BaseActivity 继承appCompatActivity,
public abstract class BaseActivity extends AppCompatActivity
{
}
这时候可以导入第三方注入包 ( Butter Knife),节省开发效率、还有代码整洁性;
ButterKnife:控件地址
关于ButterKnife注入框架使用,在android studio 估计有点麻烦.(大神直接往下看)
第一步:在项目文件下的build.gradle(详情看图一)
buildscript{
repositories{
....
//添加Butter Knife注入;
mavenCentral();
}
dependencies{
...
//Butteer Knife
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
详情图2
第二步:打开app文件下的build.gradle
...
//Butter Knife注入
apply plugin 'com.neenbedankt.android-apt'
android{
....
}
dependencies{
.....
//Butter Knife注入
compile 'com.jakewharton:butterknife:8.0.1'
apt 'com.jakewharton:butterknife-compiler:8.0.1'
}
详情看图3:
然后点击右上角Sync Now (现在同步),就ok了
图1:
图2:
图3:
回到BaseActivity上,接下来介绍ButterKnife使用方法
重写BaseActivity里的setContentView三个方法。并且初始化ButterKnife
public abstract class BaseActivity extends AppCompatActivity
{
....
/**
* 使用频率高 一般用于Activity初始化界面
* 例如 onCreate()里。初始化布局就用到setContentView(R.layout.xxxx) 就是初始化页面布局
*/
@Override
public void setContentView(int layoutResId){
super.setContentView(layoutResId);
//Butter Knife初始化
ButterKnife.bind(this);
}
/**
* 这个一般用于加载自定义控件,或者系统空间的布局
*/
@Override
public void setContentView(View view){
super.setContentView(view);
//Butter Knife初始化
ButterKnife.bind(this);
}
/**
*
*/
@Override
public void setContentView(View view,LayoutParams params){
super.setContentView(view,params)
//Butter Knife初始化
ButterKnife.bind(this);
}
...
}
这样我们就完成来一个ButterKnife初始化导入。在项目文件下创建一个名为”activity”的包(包的位置随便选,不局限创建在项目文件下)。创建一个新的Activity 并继承BaseActivity。
public class TestActivity extends BaseActivity
{
/**
*
* 这是一个注入
* 相当于 TextView mTestView = (TextView)findViewById(R.id.test);
* 从上面看出,解决以前麻烦的findViewById,并且还要强制转换的时代了
*/
@BindView(R.id.test)
TextView mTextView;
/**
*
* 如果你觉得上面还是麻烦, 这是多注入
* 相当于 mTestView[0] = (EditView)findViewById(R.id.test_01);
* .....
*/
@BindViews({R.id.test_01,R.id.test_02})
EditText mTestViews[];
/**
* 如果你感觉每次从String.xml提取文字麻烦可以用
* 相当于String name = getString(R.string.app_name)
*/
@BindString(R.string.app_name)
String mAppName;
/**
*
* 这是一个点击事件
* 相当于 findViewById(R.id.test).setOnClickListener(....)
* @param v 这参数可有可无
*/
@OnClick(R.id.test)
void onTestClick(View v) {
//代码块
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.id.test);
}
}
关于以上几个是在开发中比较常用的几个方法。
每次当创建一个Activity的时候,都要重写onCreate()方法,不知道大家都有种烦的感觉不?下面教大家一种省代码的方法,只需要重写一次onCreate()方法。
第一步:打开BaseActivity,重写onCreate()方法。创建一个抽象方法getLayoutResId();当需要展示布 局的时候直接getLayoutResId()就行了。
public abstract class BaseActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//用户在继承BaseActivity页面可以使用
setContentView(getLayoutId());
}
/**
* 这里用来返回res-->layout 里面布局
*/
public abstract int getLayoutResId();
.....
}
第二步在继承BaseActivity 重写getLayoutResId()方法
public class TestActivity extends BaseActivity
{
/**
* 返回布局
* 其实就是把onCreate()方法里面的setContentView(R.layout.xxx)提取出来
*/
@Override
public int getLayoutResId()
{
return R.layout.activity_main;
}
...
}
有人会问,如果要初始化数据那些咋办呢。没写onCreate()不行耶。
public abstract class BaseActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//用户在继承BaseActivity页面可以使用
setContentView(getLayoutId());
//初始化
init();
}
/**
* 这里用来返回res-->layout 里面布局
*/
public abstract int getLayoutResId();
/**
* 初始化逻辑
*/
public void init(){};
.....
}
然后在继承BaseActivity页面重写init()方法就解决了无法初始化的问题了
public class TestActivity extends BaseActivity
{
/**
* 返回布局
* 其实就是把onCreate()方法里面的setContentView(R.layout.xxx)提取出来
*/
@Override
public int getLayoutResId()
{
return R.layout.activity_main;
}
/**
* 页面初始化
*/
public void init(){
//可以在这填写初始化
}
...
}
当然不局限写init()这个方法初始化。例如initLogic(页面逻辑),initWeb(初始化网络) … 下面是我做的一张流程图。不怎么好 大家能借鉴一下。也希望大神在下面教我如何修改。欢迎指教